This workbook includes: 1. Creating a Seurat object from CellRanger output. 2. Preparing and cleaning the data a) Visualize QC b) Filter out unwanted cells c) Identify and remove doublets d) Normalization and scale e) Select Variable features 3. Merging and Harmonizing samples a) Merge samples b) Use Seurat find anchors to integrate c) Compare merged vs integrated 4. Dimensional reduction clustering and visualization a) PCA and component selection b) UMAP c) Clustering and visualization 5. Cluster annotation a) Visualize expression of known cell type markers b) Find cluster markers and look them up in reference cell type library c) Manual cluster annotation d) Decisions on merging clusters 6. Automated cluster annotation a) Seurat label transfer b) scClassify

Example data

We will use data from iPSC derived midbrain organoids There are two samples from dissociated midbrain organoids 1) iPSC line from a patient with Parkinson’s Disease carrying a triplication of the gene SNCA 2) The same iPSC line CRISPR corrected to make an isogenenic control

Analysis workflow

Load your required libraries. You need to have these libraries already installed.

Sys.time()
[1] "2023-04-26 14:29:45 EDT"
Warning message:
R graphics engine version 15 is not supported by this version of RStudio. The Plots tab will be disabled until a newer version of RStudio is installed. 
library(Seurat)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
Attaching SeuratObject
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ─────────────────────────────────────────── tidyverse 1.3.2 ──
✔ ggplot2 3.4.2     ✔ purrr   1.0.1
✔ tibble  3.2.1     ✔ dplyr   1.1.1
✔ tidyr   1.3.0     ✔ stringr 1.5.0
✔ readr   2.1.3     ✔ forcats 0.5.2
── Conflicts ────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
library(DoubletFinder)
library(enrichR)
Welcome to enrichR
Checking connection ... 
Enrichr ... Connection is Live!
FlyEnrichr ... Connection is available!
WormEnrichr ... Connection is available!
YeastEnrichr ... Connection is available!
FishEnrichr ... Connection is available!
OxEnrichr ... Connection is available!
library(clustree)
Loading required package: ggraph
library("scClassify")
library(SingleCellExperiment)
Warning: package ‘SingleCellExperiment’ was built under R version 4.2.2
Loading required package: SummarizedExperiment
Loading required package: MatrixGenerics
Loading required package: matrixStats

Attaching package: ‘matrixStats’

The following object is masked from ‘package:dplyr’:

    count


Attaching package: ‘MatrixGenerics’

The following objects are masked from ‘package:matrixStats’:

    colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse, colCounts,
    colCummaxs, colCummins, colCumprods, colCumsums, colDiffs,
    colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs, colMads, colMaxs,
    colMeans2, colMedians, colMins, colOrderStats, colProds, colQuantiles,
    colRanges, colRanks, colSdDiffs, colSds, colSums2, colTabulates,
    colVarDiffs, colVars, colWeightedMads, colWeightedMeans,
    colWeightedMedians, colWeightedSds, colWeightedVars, rowAlls,
    rowAnyNAs, rowAnys, rowAvgsPerColSet, rowCollapse, rowCounts,
    rowCummaxs, rowCummins, rowCumprods, rowCumsums, rowDiffs,
    rowIQRDiffs, rowIQRs, rowLogSumExps, rowMadDiffs, rowMads, rowMaxs,
    rowMeans2, rowMedians, rowMins, rowOrderStats, rowProds, rowQuantiles,
    rowRanges, rowRanks, rowSdDiffs, rowSds, rowSums2, rowTabulates,
    rowVarDiffs, rowVars, rowWeightedMads, rowWeightedMeans,
    rowWeightedMedians, rowWeightedSds, rowWeightedVars

Loading required package: GenomicRanges
Warning: package ‘GenomicRanges’ was built under R version 4.2.2
Loading required package: stats4
Loading required package: BiocGenerics

Attaching package: ‘BiocGenerics’

The following objects are masked from ‘package:dplyr’:

    combine, intersect, setdiff, union

The following objects are masked from ‘package:stats’:

    IQR, mad, sd, var, xtabs

The following objects are masked from ‘package:base’:

    anyDuplicated, aperm, append, as.data.frame, basename, cbind,
    colnames, dirname, do.call, duplicated, eval, evalq, Filter, Find,
    get, grep, grepl, intersect, is.unsorted, lapply, Map, mapply, match,
    mget, order, paste, pmax, pmax.int, pmin, pmin.int, Position, rank,
    rbind, Reduce, rownames, sapply, setdiff, sort, table, tapply, union,
    unique, unsplit, which.max, which.min

Loading required package: S4Vectors
Warning: package ‘S4Vectors’ was built under R version 4.2.2

Attaching package: ‘S4Vectors’

The following objects are masked from ‘package:dplyr’:

    first, rename

The following object is masked from ‘package:tidyr’:

    expand

The following objects are masked from ‘package:base’:

    expand.grid, I, unname

Loading required package: IRanges

Attaching package: ‘IRanges’

The following objects are masked from ‘package:dplyr’:

    collapse, desc, slice

The following object is masked from ‘package:purrr’:

    reduce

Loading required package: GenomeInfoDb
Warning: package ‘GenomeInfoDb’ was built under R version 4.2.2
Loading required package: Biobase
Welcome to Bioconductor

    Vignettes contain introductory material; view with
    'browseVignettes()'. To cite Bioconductor, see 'citation("Biobase")',
    and for packages 'citation("pkgname")'.


Attaching package: ‘Biobase’

The following object is masked from ‘package:MatrixGenerics’:

    rowMedians

The following objects are masked from ‘package:matrixStats’:

    anyMissing, rowMedians


Attaching package: ‘SummarizedExperiment’

The following object is masked from ‘package:SeuratObject’:

    Assays

The following object is masked from ‘package:Seurat’:

    Assays
library("Matrix")

Attaching package: ‘Matrix’

The following object is masked from ‘package:S4Vectors’:

    expand

The following objects are masked from ‘package:tidyr’:

    expand, pack, unpack

Load the data: Starting with the control data.

# load data

# read in the data - CellRanger output - barcodes, features, expression matrix

# you need to enter the file path to the folder with the three files
con_data <- Read10X("/Users/rhalenathomas/Documents/Data/scRNAseq/AST23_BrainComm/CellRangerOuts/AST23isogenic/raw_feature_bc_matrix") 
|--------------------------------------------------|
|==================================================|
#Look at the dimensions of the matrix
dim(con_data)
[1]   33538 6794880
#Look at a small part of the data
con_data[1:5, 1:5]
5 x 5 sparse Matrix of class "dgCMatrix"
            AAACCCAAGAAACACT-1 AAACCCAAGAAACCAT-1 AAACCCAAGAAACCCA-1
MIR1302-2HG                  .                  .                  .
FAM138A                      .                  .                  .
OR4F5                        .                  .                  .
AL627309.1                   .                  .                  .
AL627309.3                   .                  .                  .
            AAACCCAAGAAACCCG-1 AAACCCAAGAAACCTG-1
MIR1302-2HG                  .                  .
FAM138A                      .                  .
OR4F5                        .                  .
AL627309.1                   .                  .
AL627309.3                   .                  .
#Look at the distribution of the number of UMIs per cell
colSums(con_data) %>% summary
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
    0.00     0.00     0.00     4.48     0.00 58329.00 
#Look at the distribution of the number of genes per cell  
colSums(con_data > 0) %>% summary
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
   0.000    0.000    0.000    1.695    0.000 7999.000 

Remove barcodes with too few genes that could be empty droplets

#Remove barcodes with less than 100 genes detected (you can select a different value here)
# without 
con_data <- con_data[, colSums(con_data > 0)> 100]
dim(con_data)
[1] 33538  3739
colSums(con_data) %>% summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    106    2125    6243    7442   10872   58329 

Filter genes and create a Seurat object

#We might not want to include genes that occur in few cells are no cells.  Here we will filter out genes/transcripts that are in less than 3 cells. 
# you don't have to filter any genes you can also change to any filter threshold you want

#Make a Seurat object
#Removing any genes detected in less than 3 cells

# we can also filter cells at this stage too. 
con_seu <- CreateSeuratObject(con_data, project = "Control", min.cells = 3)
# look at the object dimensions
con_seu
An object of class Seurat 
18557 features across 3739 samples within 1 assay 
Active assay: RNA (18557 features, 0 variable features)

Data distribution

# look at the distribution of total counts of RNA across cells
con_seu$nCount_RNA %>% summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    106    2125    6240    7441   10870   58316 
# look at the distribution of unique RNA transcripts across cells

con_seu$nFeature_RNA %>% summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  101.0   997.5  2556.0  2433.6  3608.5  7981.0 

Visualize the distributions


VlnPlot(con_seu, features = c("nCount_RNA","nFeature_RNA"), pt.size = 0)

Filter out unwanted cells

# Example cell filtering based on mitochondrial count percentage and number of UMIs ----------

#Calculate the percentage of RNA encoded mitochondrial genes from the mitochondrial DNA
con_seu <- PercentageFeatureSet(con_seu, pattern = "^MT-", col.name = "percent.MT")
con_seu$percent.MT %>% summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.000   2.257   4.783   8.075   8.524  94.762 
VlnPlot(con_seu, features = "percent.MT", pt.size = 0.001)

Now we will filter some cells with too high mitochondrial RNA Filter out cells with too many RNA reads - these are likely doublets



#Remove any cells with more than 20% mitochondrial counts
con_seu.ft <- subset(con_seu, percent.MT < 20)

#Remove cells with very high UMI counts, which may be possible multiplets
con_seu.ft <- subset(con_seu.ft, nCount_RNA < 20000)

# see the results
VlnPlot(con_seu.ft, features = c("percent.MT", "nCount_RNA", "nFeature_RNA"), pt.size = 0.001)


# check how many cells we have
con_seu.ft
An object of class Seurat 
18557 features across 3219 samples within 1 assay 
Active assay: RNA (18557 features, 0 variable features)
VlnPlot(con_seu.ft, features = "nFeature_RNA", pt.size = 0.001, y.max = 1000)
Warning: Removed 2593 rows containing non-finite values (`stat_ydensity()`).
Warning: Removed 2593 rows containing missing values (`geom_point()`).

We might want to filter more cells with low total and/or unique RNA


# try some different filtering options
con_seu.ft <- subset(con_seu, percent.MT < 20)
dim(con_seu)
[1] 18557  3739
dim(con_seu.ft)
[1] 18557  3392

Apply final filtering conditions


con_seu_ft <- subset(con_seu, nCount_RNA < 60000 & nFeature_RNA > 500 & 
                     percent.MT < 20)

dim(con_seu_ft)
[1] 18557  2938

Clear extra data object we don’t need anymore


rm(con_data,con_seu.ft)

Normalizing

# Normalize data (log normalization) and select genes with variable expression across cells --------------------------------------

con_seu_ft <- NormalizeData(con_seu_ft, normalization.method = "LogNormalize", scale.factor = 10000)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
#Check out the effect of normalization
GetAssayData(con_seu_ft, assay = "RNA", slot = "data") %>% expm1 %>% colSums %>% head
AAACCCAAGAGCTTTC-1 AAACCCACATTGACTG-1 AAACCCAGTTTGGAAA-1 AAACCCATCATCGACA-1 
             10000              10000              10000              10000 
AAACGAAAGCCTGAAG-1 AAACGAAAGGAGAATG-1 
             10000              10000 
GetAssayData(con_seu_ft, assay = "RNA", slot = "counts") %>% colSums %>% head
AAACCCAAGAGCTTTC-1 AAACCCACATTGACTG-1 AAACCCAGTTTGGAAA-1 AAACCCATCATCGACA-1 
              8344              11697               8077               2877 
AAACGAAAGCCTGAAG-1 AAACGAAAGGAGAATG-1 
              6219               6191 

Finding Variable features

# three methods are available to choose variable features in this function
# our selection method is vst
con_seu_ft <- FindVariableFeatures(con_seu_ft, selection.method = "vst", nfeatures = 2000)
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
var  <- VariableFeatures(con_seu_ft)
VariableFeaturePlot(con_seu_ft)

var[1:10]
 [1] "DLK1"  "TTR"   "CRYAB" "TAC1"  "TPH1"  "CENPF" "ANXA1" "LDHA"  "GDF15" "TFPI2"

Dimensionality reduction PCA and UMAP

#Scaling is recommended before PCA, as otherwise highly expressed genes will have a disproportionate effect on the PC composition

# we are also regressing MT genes to remove them from the PCA
con_seu_ft <- ScaleData(con_seu_ft, vars.to.regress = "percent.MT")
Regressing out percent.MT

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |                                                                          |   1%
  |                                                                                
  |=                                                                         |   1%
  |                                                                                
  |=                                                                         |   2%
  |                                                                                
  |==                                                                        |   2%
  |                                                                                
  |==                                                                        |   3%
  |                                                                                
  |===                                                                       |   3%
  |                                                                                
  |===                                                                       |   4%
  |                                                                                
  |===                                                                       |   5%
  |                                                                                
  |====                                                                      |   5%
  |                                                                                
  |====                                                                      |   6%
  |                                                                                
  |=====                                                                     |   6%
  |                                                                                
  |=====                                                                     |   7%
  |                                                                                
  |======                                                                    |   7%
  |                                                                                
  |======                                                                    |   8%
  |                                                                                
  |======                                                                    |   9%
  |                                                                                
  |=======                                                                   |   9%
  |                                                                                
  |=======                                                                   |  10%
  |                                                                                
  |========                                                                  |  10%
  |                                                                                
  |========                                                                  |  11%
  |                                                                                
  |=========                                                                 |  12%
  |                                                                                
  |=========                                                                 |  13%
  |                                                                                
  |==========                                                                |  13%
  |                                                                                
  |==========                                                                |  14%
  |                                                                                
  |===========                                                               |  14%
  |                                                                                
  |===========                                                               |  15%
  |                                                                                
  |===========                                                               |  16%
  |                                                                                
  |============                                                              |  16%
  |                                                                                
  |============                                                              |  17%
  |                                                                                
  |=============                                                             |  17%
  |                                                                                
  |=============                                                             |  18%
  |                                                                                
  |==============                                                            |  18%
  |                                                                                
  |==============                                                            |  19%
  |                                                                                
  |==============                                                            |  20%
  |                                                                                
  |===============                                                           |  20%
  |                                                                                
  |===============                                                           |  21%
  |                                                                                
  |================                                                          |  21%
  |                                                                                
  |================                                                          |  22%
  |                                                                                
  |=================                                                         |  22%
  |                                                                                
  |=================                                                         |  23%
  |                                                                                
  |=================                                                         |  24%
  |                                                                                
  |==================                                                        |  24%
  |                                                                                
  |==================                                                        |  25%
  |                                                                                
  |===================                                                       |  25%
  |                                                                                
  |===================                                                       |  26%
  |                                                                                
  |====================                                                      |  26%
  |                                                                                
  |====================                                                      |  27%
  |                                                                                
  |====================                                                      |  28%
  |                                                                                
  |=====================                                                     |  28%
  |                                                                                
  |=====================                                                     |  29%
  |                                                                                
  |======================                                                    |  29%
  |                                                                                
  |======================                                                    |  30%
  |                                                                                
  |=======================                                                   |  30%
  |                                                                                
  |=======================                                                   |  31%
  |                                                                                
  |=======================                                                   |  32%
  |                                                                                
  |========================                                                  |  32%
  |                                                                                
  |========================                                                  |  33%
  |                                                                                
  |=========================                                                 |  33%
  |                                                                                
  |=========================                                                 |  34%
  |                                                                                
  |==========================                                                |  34%
  |                                                                                
  |==========================                                                |  35%
  |                                                                                
  |==========================                                                |  36%
  |                                                                                
  |===========================                                               |  36%
  |                                                                                
  |===========================                                               |  37%
  |                                                                                
  |============================                                              |  37%
  |                                                                                
  |============================                                              |  38%
  |                                                                                
  |=============================                                             |  39%
  |                                                                                
  |=============================                                             |  40%
  |                                                                                
  |==============================                                            |  40%
  |                                                                                
  |==============================                                            |  41%
  |                                                                                
  |===============================                                           |  41%
  |                                                                                
  |===============================                                           |  42%
  |                                                                                
  |===============================                                           |  43%
  |                                                                                
  |================================                                          |  43%
  |                                                                                
  |================================                                          |  44%
  |                                                                                
  |=================================                                         |  44%
  |                                                                                
  |=================================                                         |  45%
  |                                                                                
  |==================================                                        |  45%
  |                                                                                
  |==================================                                        |  46%
  |                                                                                
  |==================================                                        |  47%
  |                                                                                
  |===================================                                       |  47%
  |                                                                                
  |===================================                                       |  48%
  |                                                                                
  |====================================                                      |  48%
  |                                                                                
  |====================================                                      |  49%
  |                                                                                
  |=====================================                                     |  49%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |=====================================                                     |  51%
  |                                                                                
  |======================================                                    |  51%
  |                                                                                
  |======================================                                    |  52%
  |                                                                                
  |=======================================                                   |  52%
  |                                                                                
  |=======================================                                   |  53%
  |                                                                                
  |========================================                                  |  53%
  |                                                                                
  |========================================                                  |  54%
  |                                                                                
  |========================================                                  |  55%
  |                                                                                
  |=========================================                                 |  55%
  |                                                                                
  |=========================================                                 |  56%
  |                                                                                
  |==========================================                                |  56%
  |                                                                                
  |==========================================                                |  57%
  |                                                                                
  |===========================================                               |  57%
  |                                                                                
  |===========================================                               |  58%
  |                                                                                
  |===========================================                               |  59%
  |                                                                                
  |============================================                              |  59%
  |                                                                                
  |============================================                              |  60%
  |                                                                                
  |=============================================                             |  60%
  |                                                                                
  |=============================================                             |  61%
  |                                                                                
  |==============================================                            |  62%
  |                                                                                
  |==============================================                            |  63%
  |                                                                                
  |===============================================                           |  63%
  |                                                                                
  |===============================================                           |  64%
  |                                                                                
  |================================================                          |  64%
  |                                                                                
  |================================================                          |  65%
  |                                                                                
  |================================================                          |  66%
  |                                                                                
  |=================================================                         |  66%
  |                                                                                
  |=================================================                         |  67%
  |                                                                                
  |==================================================                        |  67%
  |                                                                                
  |==================================================                        |  68%
  |                                                                                
  |===================================================                       |  68%
  |                                                                                
  |===================================================                       |  69%
  |                                                                                
  |===================================================                       |  70%
  |                                                                                
  |====================================================                      |  70%
  |                                                                                
  |====================================================                      |  71%
  |                                                                                
  |=====================================================                     |  71%
  |                                                                                
  |=====================================================                     |  72%
  |                                                                                
  |======================================================                    |  72%
  |                                                                                
  |======================================================                    |  73%
  |                                                                                
  |======================================================                    |  74%
  |                                                                                
  |=======================================================                   |  74%
  |                                                                                
  |=======================================================                   |  75%
  |                                                                                
  |========================================================                  |  75%
  |                                                                                
  |========================================================                  |  76%
  |                                                                                
  |=========================================================                 |  76%
  |                                                                                
  |=========================================================                 |  77%
  |                                                                                
  |=========================================================                 |  78%
  |                                                                                
  |==========================================================                |  78%
  |                                                                                
  |==========================================================                |  79%
  |                                                                                
  |===========================================================               |  79%
  |                                                                                
  |===========================================================               |  80%
  |                                                                                
  |============================================================              |  80%
  |                                                                                
  |============================================================              |  81%
  |                                                                                
  |============================================================              |  82%
  |                                                                                
  |=============================================================             |  82%
  |                                                                                
  |=============================================================             |  83%
  |                                                                                
  |==============================================================            |  83%
  |                                                                                
  |==============================================================            |  84%
  |                                                                                
  |===============================================================           |  84%
  |                                                                                
  |===============================================================           |  85%
  |                                                                                
  |===============================================================           |  86%
  |                                                                                
  |================================================================          |  86%
  |                                                                                
  |================================================================          |  87%
  |                                                                                
  |=================================================================         |  87%
  |                                                                                
  |=================================================================         |  88%
  |                                                                                
  |==================================================================        |  89%
  |                                                                                
  |==================================================================        |  90%
  |                                                                                
  |===================================================================       |  90%
  |                                                                                
  |===================================================================       |  91%
  |                                                                                
  |====================================================================      |  91%
  |                                                                                
  |====================================================================      |  92%
  |                                                                                
  |====================================================================      |  93%
  |                                                                                
  |=====================================================================     |  93%
  |                                                                                
  |=====================================================================     |  94%
  |                                                                                
  |======================================================================    |  94%
  |                                                                                
  |======================================================================    |  95%
  |                                                                                
  |=======================================================================   |  95%
  |                                                                                
  |=======================================================================   |  96%
  |                                                                                
  |=======================================================================   |  97%
  |                                                                                
  |========================================================================  |  97%
  |                                                                                
  |========================================================================  |  98%
  |                                                                                
  |========================================================================= |  98%
  |                                                                                
  |========================================================================= |  99%
  |                                                                                
  |==========================================================================|  99%
  |                                                                                
  |==========================================================================| 100%
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
con_seu_ft@assays$RNA@scale.data %>% dim
[1] 2000 2938
#Linear dimensionality reduction
#Choosing the number of PCs can depend on how many cells you have
con_seu_ft <- RunPCA(con_seu_ft, assay = "RNA", npcs = 30)
PC_ 1 
Positive:  INA, DCX, NSG2, SYT1, BASP1, STMN1, NSG1, NREP, STMN2, IGF1 
       SOX4, PPFIA2, ANK3, MIR124-2HG, SLC8A1, CDH8, PKIA, GAD1, OLFM1, PRKAR2B 
       NNAT, CELF4, SNAP25, ATP1B1, CNTNAP2, SCN2A, SYNPR, CXADR, CSRNP3, ACSL4 
Negative:  PON2, GNG5, B2M, NTRK2, CD99, ZFP36L1, SPARC, SOX2, CLU, DBI 
       PMP2, ANXA5, CST3, CNN3, HLA-A, BCAN, PTN, NFIA, TTYH1, MPC1 
       GPM6B, TMEM123, PSAT1, CD9, CDK2AP1, PTPRZ1, CALU, MGST1, SOX9, SAT1 
PC_ 2 
Positive:  EGLN3, CYSTM1, S100A6, FTL, EIF1, SELENOM, S100A10, PLOD2, SLIT2, PLA2G16 
       SQSTM1, FTH1, CD44, CRYAB, BNIP3, PTGDS, DDIT3, ANXA2, SAT1, GDF15 
       P4HA1, CLU, NPC2, NUPR1, MAP1LC3B, MGST1, TFF3, FOXA1, ATF5, ADGRV1 
Negative:  CDK1, MKI67, TOP2A, PBK, NUSAP1, CENPF, PCLAF, NUF2, UBE2C, RRM2 
       CCNA2, NDC80, SPC25, SGO1, ESCO2, TPX2, ZWINT, CENPU, NCAPG, KIF15 
       CKAP2L, ASPM, KIF11, PIMREG, KNL1, MELK, KIFC1, CENPK, DLGAP5, MIS18BP1 
PC_ 3 
Positive:  NRXN1, MT-CO3, CSPG5, LINC00461, BCAN, OMG, VCAM1, PMP2, ST6GAL2, C1orf61 
       PTPRZ1, COLGALT2, LSAMP, LRRN3, SESN3, GABBR2, MSTN, MT-ND3, PTN, TFPI 
       MEIS2, LIX1, TTYH1, KCNQ3, SLC1A2, AQP4, CST3, LINC01896, NTRK2, ATP1B2 
Negative:  GDF15, ATF3, ATF5, S100A11, GADD45A, CDKN1A, ANXA2, EIF1, PPP1R15A, FTL 
       DDIT3, YBX3, SEC61G, TYMS, BTG3, ANXA1, CRABP2, GPNMB, S100A6, PLOD2 
       CLGN, LINC02154, TRMT112, TUBB6, CRYAB, KDELR2, TPT1, STC2, FTH1, ATF4 
PC_ 4 
Positive:  ATF3, PPP1R15A, C1orf61, ATF5, CDKN1A, GADD45G, DLL1, GDF15, DDIT3, GADD45A 
       EGFR, LINC02154, AEN, ODC1, HIST1H2AC, GPNMB, PURPL, PMP2, SGCG, EIF1 
       TRBC2, GBE1, SESN2, PMAIP1, EDA2R, SERPINB8, HRK, HIST1H4H, IFRD1, SDCBP 
Negative:  KCNJ16, SLIT2, RSPO2, PEG10, ABCA8, NRN1, FOXA1, LGI1, CFC1, DCN 
       MSX1, SERTM1, PMP22, PLXDC2, C3orf58, COL21A1, KCNMB1, PDLIM5, SULF2, ASB4 
       EFNB3, TRABD2A, PTPRG, TFF3, PAMR1, CDO1, TMEM163, VAT1L, CPE, IGFBP5 
PC_ 5 
Positive:  SOX14, SYNPR, IGF1, PRSS12, KIZ, SEMA3C, UNC13C, GAD1, GAD2, MEIS2 
       IGFBP5, CHRM2, OTX2, DMBX1, SV2C, NYAP2, DSEL, AC007159.1, NR2F2, DIRC3 
       AC110597.1, SLC32A1, GATA3, GREM2, PLCB1, ZFPM2, TSPAN18, CCSER1, IGSF21, CNTNAP2 
Negative:  GAP43, ELAVL4, NEFL, MAP1B, GLRA2, RND3, NEFM, GPRIN3, GABRG2, ELAVL2 
       TCF4, POU3F2, RAB3B, SCG2, TENM2, ARHGAP21, TMSB4X, PLPPR1, NOVA1, CRABP1 
       NTRK3, PIK3R1, DNAJC6, SLC17A6, ANKS1B, TENM1, DACH1, SYT4, FGF12, PCDH17 
PCAPlot(con_seu_ft)


#Assess how many PCs capture most of the information in the data 
ElbowPlot(con_seu_ft, ndims = 30)

We won’t run this code I’ve included this analysis that calculates the cut-off for signicance of component numbers. However the function runs multiple iterations of the PCA and will take a long time to run.

# Jackstraw

#Assess how many PCs capture most of the information in the data 
seu <-JackStraw(seu, reduction = "pca",
  dims = 30)
seu <- ScoreJackStraw(seu, reduction = "pca", dims = 1:30)
JackStrawPlot(seu, dims = 1:30)

Non-linear dimensional reduction using UMAP


#Non-linear dimensionality reduction
#Choosing how many PCs to input can depend on the elbow plot and on the number of cells
#There are many parameters that can e tweaked and optimized in a UMAP plot
#You can see some demos here: https://pair-code.github.io/understanding-umap/
con_seu_ft <- RunUMAP(con_seu_ft, dims = 1:18)
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session
14:31:52 UMAP embedding parameters a = 0.9922 b = 1.112
14:31:52 Read 2938 rows and found 18 numeric columns
14:31:52 Using Annoy for neighbor search, n_neighbors = 30
14:31:52 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
14:31:53 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpgyVOQf/fileaa4e718c5243
14:31:53 Searching Annoy index using 1 thread, search_k = 3000
14:31:53 Annoy recall = 100%
14:31:54 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
14:31:55 Initializing from normalized Laplacian + noise (using irlba)
14:31:55 Commencing optimization for 500 epochs, with 116704 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
14:32:00 Optimization finished
UMAPPlot(con_seu_ft)

NA
NA

Doublet identification


# Assess possible doublets  -----------------------------------------------
#Using instructions here: https://github.com/chris-mcginnis-ucsf/

#First we have to find a pK which determines how big of a neighborhood will be examined for doublets
#This should be chosen for each library separately
#First we test a number of pN (proportion of generated artificial doublets) and pK
#We get different lists of probabilities of artifical nearest neighbors with these tested parameters
#Also keep in mind the results are not deterministic (every run will give slightly different results)
sweep.res.con <- paramSweep_v3(con_seu_ft, PCs = 1:18, sct = FALSE)
Loading required package: fields
Loading required package: spam
Spam version 2.9-1 (2022-08-07) is loaded.
Type 'help( Spam)' or 'demo( spam)' for a short introduction 
and overview of this package.
Help for individual functions is also obtained by adding the
suffix '.spam' to the function name, e.g. 'help( chol.spam)'.

Attaching package: ‘spam’

The following object is masked from ‘package:Matrix’:

    det

The following object is masked from ‘package:stats4’:

    mle

The following objects are masked from ‘package:base’:

    backsolve, forwardsolve

Loading required package: viridis
Loading required package: viridisLite

Try help(fields) to get started.
[1] "Creating artificial doublets for pN = 5%"
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Defining neighborhoods..."
[1] "Computing pANN across all pK..."
[1] "pK = 0.005..."
[1] "pK = 0.01..."
[1] "pK = 0.02..."
[1] "pK = 0.03..."
[1] "pK = 0.04..."
[1] "pK = 0.05..."
[1] "pK = 0.06..."
[1] "pK = 0.07..."
[1] "pK = 0.08..."
[1] "pK = 0.09..."
[1] "pK = 0.1..."
[1] "pK = 0.11..."
[1] "pK = 0.12..."
[1] "pK = 0.13..."
[1] "pK = 0.14..."
[1] "pK = 0.15..."
[1] "pK = 0.16..."
[1] "pK = 0.17..."
[1] "pK = 0.18..."
[1] "pK = 0.19..."
[1] "pK = 0.2..."
[1] "pK = 0.21..."
[1] "pK = 0.22..."
[1] "pK = 0.23..."
[1] "pK = 0.24..."
[1] "pK = 0.25..."
[1] "pK = 0.26..."
[1] "pK = 0.27..."
[1] "pK = 0.28..."
[1] "pK = 0.29..."
[1] "pK = 0.3..."
[1] "Creating artificial doublets for pN = 10%"
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Defining neighborhoods..."
[1] "Computing pANN across all pK..."
[1] "pK = 0.005..."
[1] "pK = 0.01..."
[1] "pK = 0.02..."
[1] "pK = 0.03..."
[1] "pK = 0.04..."
[1] "pK = 0.05..."
[1] "pK = 0.06..."
[1] "pK = 0.07..."
[1] "pK = 0.08..."
[1] "pK = 0.09..."
[1] "pK = 0.1..."
[1] "pK = 0.11..."
[1] "pK = 0.12..."
[1] "pK = 0.13..."
[1] "pK = 0.14..."
[1] "pK = 0.15..."
[1] "pK = 0.16..."
[1] "pK = 0.17..."
[1] "pK = 0.18..."
[1] "pK = 0.19..."
[1] "pK = 0.2..."
[1] "pK = 0.21..."
[1] "pK = 0.22..."
[1] "pK = 0.23..."
[1] "pK = 0.24..."
[1] "pK = 0.25..."
[1] "pK = 0.26..."
[1] "pK = 0.27..."
[1] "pK = 0.28..."
[1] "pK = 0.29..."
[1] "pK = 0.3..."
[1] "Creating artificial doublets for pN = 15%"
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Defining neighborhoods..."
[1] "Computing pANN across all pK..."
[1] "pK = 0.005..."
[1] "pK = 0.01..."
[1] "pK = 0.02..."
[1] "pK = 0.03..."
[1] "pK = 0.04..."
[1] "pK = 0.05..."
[1] "pK = 0.06..."
[1] "pK = 0.07..."
[1] "pK = 0.08..."
[1] "pK = 0.09..."
[1] "pK = 0.1..."
[1] "pK = 0.11..."
[1] "pK = 0.12..."
[1] "pK = 0.13..."
[1] "pK = 0.14..."
[1] "pK = 0.15..."
[1] "pK = 0.16..."
[1] "pK = 0.17..."
[1] "pK = 0.18..."
[1] "pK = 0.19..."
[1] "pK = 0.2..."
[1] "pK = 0.21..."
[1] "pK = 0.22..."
[1] "pK = 0.23..."
[1] "pK = 0.24..."
[1] "pK = 0.25..."
[1] "pK = 0.26..."
[1] "pK = 0.27..."
[1] "pK = 0.28..."
[1] "pK = 0.29..."
[1] "pK = 0.3..."
[1] "Creating artificial doublets for pN = 20%"
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Defining neighborhoods..."
[1] "Computing pANN across all pK..."
[1] "pK = 0.005..."
[1] "pK = 0.01..."
[1] "pK = 0.02..."
[1] "pK = 0.03..."
[1] "pK = 0.04..."
[1] "pK = 0.05..."
[1] "pK = 0.06..."
[1] "pK = 0.07..."
[1] "pK = 0.08..."
[1] "pK = 0.09..."
[1] "pK = 0.1..."
[1] "pK = 0.11..."
[1] "pK = 0.12..."
[1] "pK = 0.13..."
[1] "pK = 0.14..."
[1] "pK = 0.15..."
[1] "pK = 0.16..."
[1] "pK = 0.17..."
[1] "pK = 0.18..."
[1] "pK = 0.19..."
[1] "pK = 0.2..."
[1] "pK = 0.21..."
[1] "pK = 0.22..."
[1] "pK = 0.23..."
[1] "pK = 0.24..."
[1] "pK = 0.25..."
[1] "pK = 0.26..."
[1] "pK = 0.27..."
[1] "pK = 0.28..."
[1] "pK = 0.29..."
[1] "pK = 0.3..."
[1] "Creating artificial doublets for pN = 25%"
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Defining neighborhoods..."
[1] "Computing pANN across all pK..."
[1] "pK = 0.005..."
[1] "pK = 0.01..."
[1] "pK = 0.02..."
[1] "pK = 0.03..."
[1] "pK = 0.04..."
[1] "pK = 0.05..."
[1] "pK = 0.06..."
[1] "pK = 0.07..."
[1] "pK = 0.08..."
[1] "pK = 0.09..."
[1] "pK = 0.1..."
[1] "pK = 0.11..."
[1] "pK = 0.12..."
[1] "pK = 0.13..."
[1] "pK = 0.14..."
[1] "pK = 0.15..."
[1] "pK = 0.16..."
[1] "pK = 0.17..."
[1] "pK = 0.18..."
[1] "pK = 0.19..."
[1] "pK = 0.2..."
[1] "pK = 0.21..."
[1] "pK = 0.22..."
[1] "pK = 0.23..."
[1] "pK = 0.24..."
[1] "pK = 0.25..."
[1] "pK = 0.26..."
[1] "pK = 0.27..."
[1] "pK = 0.28..."
[1] "pK = 0.29..."
[1] "pK = 0.3..."
[1] "Creating artificial doublets for pN = 30%"
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Defining neighborhoods..."
[1] "Computing pANN across all pK..."
[1] "pK = 0.005..."
[1] "pK = 0.01..."
[1] "pK = 0.02..."
[1] "pK = 0.03..."
[1] "pK = 0.04..."
[1] "pK = 0.05..."
[1] "pK = 0.06..."
[1] "pK = 0.07..."
[1] "pK = 0.08..."
[1] "pK = 0.09..."
[1] "pK = 0.1..."
[1] "pK = 0.11..."
[1] "pK = 0.12..."
[1] "pK = 0.13..."
[1] "pK = 0.14..."
[1] "pK = 0.15..."
[1] "pK = 0.16..."
[1] "pK = 0.17..."
[1] "pK = 0.18..."
[1] "pK = 0.19..."
[1] "pK = 0.2..."
[1] "pK = 0.21..."
[1] "pK = 0.22..."
[1] "pK = 0.23..."
[1] "pK = 0.24..."
[1] "pK = 0.25..."
[1] "pK = 0.26..."
[1] "pK = 0.27..."
[1] "pK = 0.28..."
[1] "pK = 0.29..."
[1] "pK = 0.3..."
#We do not have the "ground truth" regarding doublets, such from from genotype data for pooled samples 
#We sumamrize the performance of the range of pN=pK parameters we tested
sweep.stats_con <- summarizeSweep(sweep.res.con, GT = FALSE)
Loading required package: KernSmooth
KernSmooth 2.23 loaded
Copyright M. P. Wand 1997-2009
Loading required package: ROCR
#Here the "best" pK for the data is chosen based on a metric determined by the DoubletFinder developers
#Which performs best in datasets where the ground truth is known
bcmvn_con <- find.pK(sweep.stats_con)
NULL

ggplot(bcmvn_con, aes(x = pK, y = BCmetric, group = "Sweep")) + geom_point() + geom_line() + 
  theme(axis.text.x = element_text(angle = 90))


#We will pick pK = 0.08
#We are not going to use our clustering information to estimate "homotypic" doublets
#We are simply going to use an expected doublet formation rate of 2.5% based on the number of starting cells loaded

nExp_poi <- round(0.025*nrow(con_seu_ft@meta.data))
con_seu_ft <- doubletFinder_v3(con_seu_ft, PCs = 1:18, pN = 0.25, pK = 0.08, nExp = nExp_poi, reuse.pANN = FALSE, sct = FALSE)
[1] "Creating 979 artificial doublets..."
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Computing pANN..."
[1] "Classifying doublets.."
#Here we update the Seurat object version just in case the one returned by DoubletFinder is an older version
con_seu_ft <- UpdateSeuratObject(con_seu_ft)
Validating object structure
Updating object slots
Ensuring keys are in the proper structure
Ensuring feature names don't have underscores or pipes
Object representation is consistent with the most current Seurat version
# we have now identified doublets but we have not removed them

Visualize the doublet removal results


# we need to look in the data object

#Visualize and assess the cells called as probable doublets
UMAPPlot(con_seu_ft, group.by = "DF.classifications_0.25_0.08_73")


# table of doublets and signlets
con_seu_ft$DF.classifications_0.25_0.08_73 %>% table
.
Doublet Singlet 
     73    2865 
# visualize the features in doublets and singlets
VlnPlot(con_seu_ft, features = c("nCount_RNA", "nFeature_RNA", "percent.MT", "pANN_0.25_0.08_73"), 
        group.by = "DF.classifications_0.25_0.08_73", pt.size = 0.001, ncol = 2, log = TRUE)

# remove the doublets
# we can do this by subset
# first we need to set the active meta data slot to the doublet identification
Idents(con_seu_ft) <- "DF.classifications_0.25_0.08_73"
# we select only the singlet cells
con_seu_ft2 <- subset(con_seu_ft, idents = "Singlet")
dim(con_seu_ft)
[1] 18557  2938
dim(con_seu_ft2)
[1] 18557  2865

Repeat the above steps for the SNCA triplication patient line

# read in data

ast_data <- Read10X("/Users/rhalenathomas/Documents/Data/scRNAseq/AST23_BrainComm/CellRangerOuts/AST23/raw_feature_bc_matrix")


# create seurat object


# filter object with the same settings as with the control


# PCA analysis

# Remove doublets
# clean up 
rm(ast_data,ast_seu_ft,bcmvn_ast,bcmvn_con,con_seu_ft, sweep.res.ast, sweep.res.con, sweep.stats_ast, sweep.stats_con)

BREAK

Merge data objects


merge_seurat <- merge(con_seu_ft2,ast_seu_ft2)
Warning in CheckDuplicateCellNames(object.list = objects) :
  Some cell names are duplicated across objects provided. Renaming to enforce unique cell names.
merge_seurat
An object of class Seurat 
19204 features across 4028 samples within 1 assay 
Active assay: RNA (19204 features, 0 variable features)
unique(merge_seurat$orig.ident)
[1] "Control" "SNCA"   

Find anchors between the two data objects

sample.list <- SplitObject(merge_seurat, split.by = "orig.ident")

# We have already normalized and identified variable features in each sample
# If we had not done so we can normalize here
#for (i in 1:length(sample.list)){
 # org.list[[i]] <- NormalizeData(org.list[[i]], verbose = FALSE)
  #org.list[[i]] <- FindVariableFeatures(org.list[[i]], selection.method = "vst")
#}

# Now we find features that can act as anchors between the two samples
int.anchors <- FindIntegrationAnchors(object.list = sample.list, dims = 1:50)
Computing 2000 integration features
No variable features found for object1 in the object.list. Running FindVariableFeatures ...
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
No variable features found for object2 in the object.list. Running FindVariableFeatures ...
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Scaling features for provided objects

  |                                                  | 0 % ~calculating  
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Finding all pairwise anchors

  |                                                  | 0 % ~calculating  
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 4320 anchors
Filtering anchors
    Retained 3529 anchors

  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=16s  
integrated_seurat <- IntegrateData(anchorset = int.anchors, dims = 1:50)
Merging dataset 2 into 1
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data

Optional: save the integrated object or read in the Integrated object for the next step.

# remove # comment from the code you want to run

saveRDS(integrated_seurat,"IntegratedSeurat.RDS")
#integrated_seurate <- readRDS("IntegratedSeurat.RDS")

PCA and UMAP on the merged object

# merged object

DefaultAssay(merge_seurat) <- "RNA"

merge_seurat <- ScaleData(merge_seurat, verbose = FALSE)
# in the merge data set we sill need features for the PCA input
merge_seurat <- FindVariableFeatures(merge_seurat, selection.method = "vst")
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
merge_seurat <- RunPCA(merge_seurat, npcs = 30, verbose = FALSE)
merge_seurat <- RunUMAP(merge_seurat, reduction = "pca", dims = 1:30)
15:10:21 UMAP embedding parameters a = 0.9922 b = 1.112
Found more than one class "dist" in cache; using the first, from namespace 'BiocGenerics'
Also defined by ‘spam’
15:10:21 Read 4028 rows and found 30 numeric columns
15:10:21 Using Annoy for neighbor search, n_neighbors = 30
Found more than one class "dist" in cache; using the first, from namespace 'BiocGenerics'
Also defined by ‘spam’
15:10:21 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:10:22 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpgyVOQf/fileaa4ec70e42c
15:10:22 Searching Annoy index using 1 thread, search_k = 3000
15:10:22 Annoy recall = 100%
15:10:23 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
15:10:24 Initializing from normalized Laplacian + noise (using irlba)
15:10:24 Commencing optimization for 500 epochs, with 163142 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:10:31 Optimization finished

Repeat PCA and UMAP for the integrated object

Idents(integrated_seurat) <- "integrated"
integrated_seurat <- ScaleData(integrated_seurat, verbose = FALSE)
# only the integrated features will be the pca input

integrated_seurat <- RunPCA(integrated_seurat, npcs = 30, verbose = FALSE)
integrated_seurat <- RunUMAP(integrated_seurat, reduction = "pca", dims = 1:30)
15:10:48 UMAP embedding parameters a = 0.9922 b = 1.112
Found more than one class "dist" in cache; using the first, from namespace 'BiocGenerics'
Also defined by ‘spam’
15:10:48 Read 4028 rows and found 30 numeric columns
15:10:48 Using Annoy for neighbor search, n_neighbors = 30
Found more than one class "dist" in cache; using the first, from namespace 'BiocGenerics'
Also defined by ‘spam’
15:10:48 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:10:48 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpgyVOQf/fileaa4e47940b15
15:10:48 Searching Annoy index using 1 thread, search_k = 3000
15:10:49 Annoy recall = 100%
15:10:49 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
15:10:50 Initializing from normalized Laplacian + noise (using irlba)
15:10:50 Commencing optimization for 500 epochs, with 165954 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:10:57 Optimization finished

Optional: save the PCA and UMAP integrated object or read in the saved object

# remove # comment from the code you want to run
saveRDS(integrated_seurat,"IntegratedSeuratGraphs.RDS")
#integrated_seurat <- readRDS("IntegratedSeuratGraphs.RDS")

Let’s look at the UMAPs from the merged vs the integrated data


p1 <- DimPlot(merge_seurat, group.by = "orig.ident") + ggtitle("Merge")
p2 <- DimPlot(integrated_seurat, group.by = "orig.ident") + ggtitle("Integrated")

p1

p2

We see almost no difference in this data. This is not the case in all data sets

Cluster the integrated data

# see the importance of the pca components
ElbowPlot(integrated_seurat, ndims=30)

integrated_seurat
An object of class Seurat 
21204 features across 4028 samples within 2 assays 
Active assay: integrated (2000 features, 2000 variable features)
 1 other assay present: RNA
 2 dimensional reductions calculated: pca, umap
dim(integrated_seurat)
[1] 2000 4028

We will choose 20 PCs There are 4028 cells. A common rule of thumb for choosing k for nearest neighbours is using the square root of the number of cells = 63

Visualize the UMAP of the different cluster resolutions

res <- c(0.05,0.25,0.4,0.5,0.6,1,1.5)
resolutions <- paste("integrated_snn_res.", res, sep="")
resolutions
[1] "integrated_snn_res.0.05" "integrated_snn_res.0.25" "integrated_snn_res.0.4" 
[4] "integrated_snn_res.0.5"  "integrated_snn_res.0.6"  "integrated_snn_res.1"   
[7] "integrated_snn_res.1.5" 
for(r in resolutions){
  print(DimPlot(integrated_seurat, group.by = r))
}

NA
NA

BREAK

Now we need to choose a resolution to annotate. I will select resolution of 0.6.

# Scale the total RNA
# before we only scaled the integrated expression for the genes used for integration
# now we want to scale all genes

DefaultAssay(integrated_seurat) <- "RNA"
integrated_seurat <- ScaleData(integrated_seurat)
Centering and scaling data matrix

  |                                                                                          
  |                                                                                    |   0%
  |                                                                                          
  |====                                                                                |   5%
  |                                                                                          
  |========                                                                            |  10%
  |                                                                                          
  |=============                                                                       |  15%
  |                                                                                          
  |=================                                                                   |  20%
  |                                                                                          
  |=====================                                                               |  25%
  |                                                                                          
  |=========================                                                           |  30%
  |                                                                                          
  |=============================                                                       |  35%
  |                                                                                          
  |==================================                                                  |  40%
  |                                                                                          
  |======================================                                              |  45%
  |                                                                                          
  |==========================================                                          |  50%
  |                                                                                          
  |==============================================                                      |  55%
  |                                                                                          
  |==================================================                                  |  60%
  |                                                                                          
  |=======================================================                             |  65%
  |                                                                                          
  |===========================================================                         |  70%
  |                                                                                          
  |===============================================================                     |  75%
  |                                                                                          
  |===================================================================                 |  80%
  |                                                                                          
  |=======================================================================             |  85%
  |                                                                                          
  |============================================================================        |  90%
  |                                                                                          
  |================================================================================    |  95%
  |                                                                                          
  |====================================================================================| 100%

Look at known cell type markers

# features list from literature

da_neurons <- c("TH","SLC6A3","SLC18A2","SOX6","NDNF","SNCG","ALDH1A1","CALB1","TACR2","SLC17A6","SLC32A1","OTX2","GRP","LPL","CCK","VIP")
NPC_orStemLike <- c("DCX","NEUROD1","TBR1","PCNA","MKI67","SOX2","NES","PAX6","MASH1")
mature_neurons = c("RBFOX3","SYP","DLG45","VAMP1","VAMP2","TUBB3","SYT1","BSN","HOMER1","SLC17A6")
excitatory_neurons = c("GRIA2","GRIA1","GRIA4","GRIN1","GRIN2B","GRIN2A","GRIN3A","GRIN3","GRIP1","CAMK2A")
inhbitory_neurons = inh = c("GAD1","GAD2", "GAT1","PVALB","GABR2","GABR1","GBRR1","GABRB2","GABRB1","GABRB3","GABRA6","GABRA1","GABRA4","TRAK2")
astrocytes <- c("GFAP","S100B","AQP4","APOE", "SOX9","SLC1A3")
oligodendrocytes <- c("MBP","MOG","OLIG1","OLIG2","SOX10")
opc <- 
radial_glia <- c("PTPRC","AIF1","ADGRE1", "VIM", "TNC","PTPRZ1","FAM107A","HOPX","LIFR",
              "ITGB5","IL6ST","SLC1A3")
epithelial <- c("HES1","HES5","SOX2","SOX10","NES","CDH1","NOTCH1")

microglia <- c("IBA1","P2RY12","P2RY13","TREM119", "GPR34","SIGLECH","TREM2",
               "CX3CR1","FCRLS","OLFML3","HEXB","TGFBR1", "SALL1","MERTK",
               "PROS1")

features_list <- c("MKI67","SOX2","POU5F1","DLX2","PAX6","SOX9","HES1","NES","RBFOX3","MAP2","NCAM1","CD24","GRIA2","GRIN2B","GABBR1","GAD1","GAD2","GABRA1","GABRB2","TH","ALDH1A1","LMX1B","NR4A2","CORIN","CALB1","KCNJ6","CXCR4","ITGA6","SLC1A3","CD44","AQP4","S100B", "PDGFRA","OLIG2","MBP","CLDN11","VIM","VCAM1")

short_list <- c("MKI67","SOX9","HES1","NES","DLX2","RBFOX3","MAP2","TH","CALB1","KCNJ6","SLC1A3","CD44","AQP4","S100B","OLIG2","MBP","VIM")

Seurat has several helpful plotting function that use ggplot

# we set the active identity of the meta data to be the clusters at the resolution we want to label
Idents(integrated_seurat) <- "integrated_snn_res.0.6"

FeaturePlot(integrated_seurat, label = TRUE, features = short_list)

NA
NA
NA
# this will let us see one at at time
for (i in short_list) {
  print(FeaturePlot(integrated_seurat, features = i, min.cutoff = 'q1', max.cutoff = 'q97', label = TRUE))
}

NA
NA

Now that we see the TH is all in one spot that is part of a large cluster we look back at the different cluster level.

Dot Plots


DotPlot(integrated_seurat, group.by = "integrated_snn_res.1", 
        features = short_list, assay = "RNA") + RotatedAxis()




DotPlot(integrated_seurat, group.by = "integrated_snn_res.1", 
        features = da_neurons, assay = "RNA") + RotatedAxis()
Warning in FetchData.Seurat(object = object, vars = features, cells = cells) :
  The following requested variables were not found: SLC6A3, TACR2, VIP

DotPlot(integrated_seurat, group.by = "integrated_snn_res.1", 
        features = mature_neurons, assay = "RNA") + RotatedAxis()
Warning in FetchData.Seurat(object = object, vars = features, cells = cells) :
  The following requested variables were not found: DLG45

Heatmaps



DoHeatmap(integrated_seurat, group.by = "integrated_snn_res.1", 
        features = short_list, slot = "scale.data")

NA
NA

Look at more expression lists

Find Cluster markers

# cluster markers will be calculated for the active identity

Idents(integrated_seurat) <- "integrated_snn_res.1"
ClusterMarkers <- FindAllMarkers(integrated_seurat, only.pos = TRUE)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~14s          
  |++                                                | 2 % ~14s          
  |++                                                | 3 % ~14s          
  |+++                                               | 4 % ~14s          
  |+++                                               | 5 % ~13s          
  |++++                                              | 6 % ~13s          
  |++++                                              | 8 % ~13s          
  |+++++                                             | 9 % ~13s          
  |+++++                                             | 10% ~13s          
  |++++++                                            | 11% ~12s          
  |++++++                                            | 12% ~12s          
  |+++++++                                           | 13% ~12s          
  |+++++++                                           | 14% ~12s          
  |++++++++                                          | 15% ~12s          
  |+++++++++                                         | 16% ~11s          
  |+++++++++                                         | 17% ~11s          
  |++++++++++                                        | 18% ~11s          
  |++++++++++                                        | 19% ~11s          
  |+++++++++++                                       | 20% ~11s          
  |+++++++++++                                       | 22% ~11s          
  |++++++++++++                                      | 23% ~10s          
  |++++++++++++                                      | 24% ~10s          
  |+++++++++++++                                     | 25% ~10s          
  |+++++++++++++                                     | 26% ~10s          
  |++++++++++++++                                    | 27% ~10s          
  |++++++++++++++                                    | 28% ~10s          
  |+++++++++++++++                                   | 29% ~10s          
  |++++++++++++++++                                  | 30% ~09s          
  |++++++++++++++++                                  | 31% ~09s          
  |+++++++++++++++++                                 | 32% ~09s          
  |+++++++++++++++++                                 | 33% ~09s          
  |++++++++++++++++++                                | 34% ~09s          
  |++++++++++++++++++                                | 35% ~09s          
  |+++++++++++++++++++                               | 37% ~09s          
  |+++++++++++++++++++                               | 38% ~09s          
  |++++++++++++++++++++                              | 39% ~09s          
  |++++++++++++++++++++                              | 40% ~08s          
  |+++++++++++++++++++++                             | 41% ~08s          
  |+++++++++++++++++++++                             | 42% ~08s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |+++++++++++++++++++++++                           | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~08s          
  |++++++++++++++++++++++++                          | 46% ~07s          
  |++++++++++++++++++++++++                          | 47% ~07s          
  |+++++++++++++++++++++++++                         | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |++++++++++++++++++++++++++                        | 52% ~07s          
  |+++++++++++++++++++++++++++                       | 53% ~07s          
  |+++++++++++++++++++++++++++                       | 54% ~06s          
  |++++++++++++++++++++++++++++                      | 55% ~06s          
  |++++++++++++++++++++++++++++                      | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |++++++++++++++++++++++++++++++                    | 58% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |+++++++++++++++++++++++++++++++                   | 60% ~05s          
  |+++++++++++++++++++++++++++++++                   | 61% ~05s          
  |++++++++++++++++++++++++++++++++                  | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |++++++++++++++++++++++++++++++++++                | 68% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=13s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~12s          
  |++                                                | 2 % ~11s          
  |++                                                | 3 % ~11s          
  |+++                                               | 4 % ~11s          
  |+++                                               | 5 % ~11s          
  |++++                                              | 7 % ~10s          
  |++++                                              | 8 % ~10s          
  |+++++                                             | 9 % ~10s          
  |+++++                                             | 10% ~10s          
  |++++++                                            | 11% ~10s          
  |+++++++                                           | 12% ~10s          
  |+++++++                                           | 13% ~10s          
  |++++++++                                          | 14% ~09s          
  |++++++++                                          | 15% ~09s          
  |+++++++++                                         | 16% ~09s          
  |+++++++++                                         | 18% ~09s          
  |++++++++++                                        | 19% ~09s          
  |++++++++++                                        | 20% ~09s          
  |+++++++++++                                       | 21% ~09s          
  |+++++++++++                                       | 22% ~09s          
  |++++++++++++                                      | 23% ~08s          
  |+++++++++++++                                     | 24% ~08s          
  |+++++++++++++                                     | 25% ~08s          
  |++++++++++++++                                    | 26% ~08s          
  |++++++++++++++                                    | 27% ~08s          
  |+++++++++++++++                                   | 29% ~08s          
  |+++++++++++++++                                   | 30% ~08s          
  |++++++++++++++++                                  | 31% ~07s          
  |++++++++++++++++                                  | 32% ~07s          
  |+++++++++++++++++                                 | 33% ~07s          
  |++++++++++++++++++                                | 34% ~07s          
  |++++++++++++++++++                                | 35% ~07s          
  |+++++++++++++++++++                               | 36% ~07s          
  |+++++++++++++++++++                               | 37% ~07s          
  |++++++++++++++++++++                              | 38% ~07s          
  |++++++++++++++++++++                              | 40% ~07s          
  |+++++++++++++++++++++                             | 41% ~06s          
  |+++++++++++++++++++++                             | 42% ~06s          
  |++++++++++++++++++++++                            | 43% ~06s          
  |++++++++++++++++++++++                            | 44% ~06s          
  |+++++++++++++++++++++++                           | 45% ~06s          
  |++++++++++++++++++++++++                          | 46% ~06s          
  |++++++++++++++++++++++++                          | 47% ~06s          
  |+++++++++++++++++++++++++                         | 48% ~06s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |++++++++++++++++++++++++++                        | 52% ~05s          
  |+++++++++++++++++++++++++++                       | 53% ~05s          
  |+++++++++++++++++++++++++++                       | 54% ~05s          
  |++++++++++++++++++++++++++++                      | 55% ~05s          
  |+++++++++++++++++++++++++++++                     | 56% ~05s          
  |+++++++++++++++++++++++++++++                     | 57% ~05s          
  |++++++++++++++++++++++++++++++                    | 58% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |+++++++++++++++++++++++++++++++                   | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 63% ~04s          
  |++++++++++++++++++++++++++++++++                  | 64% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~04s          
  |++++++++++++++++++++++++++++++++++                | 67% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=11s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~07s          
  |+                                                 | 2 % ~07s          
  |++                                                | 3 % ~07s          
  |++                                                | 4 % ~07s          
  |+++                                               | 5 % ~06s          
  |+++                                               | 6 % ~06s          
  |++++                                              | 7 % ~06s          
  |++++                                              | 8 % ~06s          
  |+++++                                             | 9 % ~06s          
  |+++++                                             | 10% ~06s          
  |++++++                                            | 11% ~06s          
  |++++++                                            | 12% ~06s          
  |+++++++                                           | 13% ~06s          
  |+++++++                                           | 14% ~06s          
  |++++++++                                          | 15% ~06s          
  |++++++++                                          | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |+++++++++                                         | 18% ~06s          
  |++++++++++                                        | 19% ~05s          
  |++++++++++                                        | 20% ~05s          
  |+++++++++++                                       | 21% ~05s          
  |+++++++++++                                       | 22% ~05s          
  |++++++++++++                                      | 23% ~05s          
  |++++++++++++                                      | 24% ~05s          
  |+++++++++++++                                     | 25% ~05s          
  |+++++++++++++                                     | 26% ~05s          
  |++++++++++++++                                    | 27% ~05s          
  |++++++++++++++                                    | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |+++++++++++++++                                   | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |+++++++++++++++++                                 | 34% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |++++++++++++++++++                                | 36% ~04s          
  |+++++++++++++++++++                               | 37% ~04s          
  |+++++++++++++++++++                               | 38% ~04s          
  |++++++++++++++++++++                              | 39% ~04s          
  |++++++++++++++++++++                              | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |+++++++++++++++++++++                             | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |++++++++++++++++++++++                            | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |+++++++++++++++++++++++                           | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |++++++++++++++++++++++++                          | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |++++++++++++++++++++++++++                        | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |+++++++++++++++++++++++++++                       | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=07s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~19s          
  |++                                                | 2 % ~19s          
  |++                                                | 3 % ~19s          
  |+++                                               | 4 % ~18s          
  |+++                                               | 5 % ~18s          
  |++++                                              | 6 % ~18s          
  |++++                                              | 7 % ~17s          
  |+++++                                             | 8 % ~17s          
  |+++++                                             | 9 % ~17s          
  |++++++                                            | 10% ~17s          
  |++++++                                            | 11% ~17s          
  |+++++++                                           | 12% ~16s          
  |+++++++                                           | 14% ~16s          
  |++++++++                                          | 15% ~16s          
  |++++++++                                          | 16% ~16s          
  |+++++++++                                         | 17% ~16s          
  |+++++++++                                         | 18% ~15s          
  |++++++++++                                        | 19% ~15s          
  |++++++++++                                        | 20% ~15s          
  |+++++++++++                                       | 21% ~15s          
  |+++++++++++                                       | 22% ~15s          
  |++++++++++++                                      | 23% ~14s          
  |++++++++++++                                      | 24% ~14s          
  |+++++++++++++                                     | 25% ~14s          
  |++++++++++++++                                    | 26% ~14s          
  |++++++++++++++                                    | 27% ~14s          
  |+++++++++++++++                                   | 28% ~13s          
  |+++++++++++++++                                   | 29% ~13s          
  |++++++++++++++++                                  | 30% ~13s          
  |++++++++++++++++                                  | 31% ~13s          
  |+++++++++++++++++                                 | 32% ~13s          
  |+++++++++++++++++                                 | 33% ~12s          
  |++++++++++++++++++                                | 34% ~12s          
  |++++++++++++++++++                                | 35% ~12s          
  |+++++++++++++++++++                               | 36% ~12s          
  |+++++++++++++++++++                               | 38% ~12s          
  |++++++++++++++++++++                              | 39% ~11s          
  |++++++++++++++++++++                              | 40% ~11s          
  |+++++++++++++++++++++                             | 41% ~11s          
  |+++++++++++++++++++++                             | 42% ~11s          
  |++++++++++++++++++++++                            | 43% ~11s          
  |++++++++++++++++++++++                            | 44% ~11s          
  |+++++++++++++++++++++++                           | 45% ~10s          
  |+++++++++++++++++++++++                           | 46% ~10s          
  |++++++++++++++++++++++++                          | 47% ~10s          
  |++++++++++++++++++++++++                          | 48% ~10s          
  |+++++++++++++++++++++++++                         | 49% ~10s          
  |+++++++++++++++++++++++++                         | 50% ~09s          
  |++++++++++++++++++++++++++                        | 51% ~09s          
  |+++++++++++++++++++++++++++                       | 52% ~09s          
  |+++++++++++++++++++++++++++                       | 53% ~09s          
  |++++++++++++++++++++++++++++                      | 54% ~09s          
  |++++++++++++++++++++++++++++                      | 55% ~08s          
  |+++++++++++++++++++++++++++++                     | 56% ~08s          
  |+++++++++++++++++++++++++++++                     | 57% ~08s          
  |++++++++++++++++++++++++++++++                    | 58% ~08s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |+++++++++++++++++++++++++++++++                   | 60% ~07s          
  |+++++++++++++++++++++++++++++++                   | 61% ~07s          
  |++++++++++++++++++++++++++++++++                  | 62% ~07s          
  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~06s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |++++++++++++++++++++++++++++++++++                | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=18s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~06s          
  |++                                                | 2 % ~06s          
  |++                                                | 3 % ~06s          
  |+++                                               | 4 % ~06s          
  |+++                                               | 5 % ~06s          
  |++++                                              | 6 % ~06s          
  |++++                                              | 7 % ~06s          
  |+++++                                             | 8 % ~06s          
  |+++++                                             | 9 % ~06s          
  |++++++                                            | 10% ~05s          
  |++++++                                            | 11% ~05s          
  |+++++++                                           | 12% ~05s          
  |+++++++                                           | 14% ~05s          
  |++++++++                                          | 15% ~05s          
  |++++++++                                          | 16% ~05s          
  |+++++++++                                         | 17% ~05s          
  |+++++++++                                         | 18% ~05s          
  |++++++++++                                        | 19% ~05s          
  |++++++++++                                        | 20% ~05s          
  |+++++++++++                                       | 21% ~05s          
  |+++++++++++                                       | 22% ~05s          
  |++++++++++++                                      | 23% ~05s          
  |++++++++++++                                      | 24% ~05s          
  |+++++++++++++                                     | 25% ~05s          
  |++++++++++++++                                    | 26% ~05s          
  |++++++++++++++                                    | 27% ~04s          
  |+++++++++++++++                                   | 28% ~04s          
  |+++++++++++++++                                   | 29% ~04s          
  |++++++++++++++++                                  | 30% ~04s          
  |++++++++++++++++                                  | 31% ~04s          
  |+++++++++++++++++                                 | 32% ~04s          
  |+++++++++++++++++                                 | 33% ~04s          
  |++++++++++++++++++                                | 34% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |+++++++++++++++++++                               | 36% ~04s          
  |+++++++++++++++++++                               | 38% ~04s          
  |++++++++++++++++++++                              | 39% ~04s          
  |++++++++++++++++++++                              | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |+++++++++++++++++++++                             | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |++++++++++++++++++++++                            | 44% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |+++++++++++++++++++++++                           | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |++++++++++++++++++++++++                          | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |+++++++++++++++++++++++++++                       | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |++++++++++++++++++++++++++++                      | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |+++++++++++++++++++++++++++++                     | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |++++++++++++++++++++++++++++++                    | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |+++++++++++++++++++++++++++++++                   | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=06s  
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~15s          
  |++                                                | 2 % ~14s          
  |++                                                | 3 % ~13s          
  |+++                                               | 4 % ~13s          
  |+++                                               | 5 % ~13s          
  |++++                                              | 6 % ~13s          
  |++++                                              | 7 % ~13s          
  |+++++                                             | 8 % ~13s          
  |+++++                                             | 9 % ~13s          
  |++++++                                            | 10% ~12s          
  |++++++                                            | 11% ~12s          
  |+++++++                                           | 12% ~12s          
  |+++++++                                           | 13% ~12s          
  |++++++++                                          | 14% ~12s          
  |++++++++                                          | 15% ~12s          
  |+++++++++                                         | 16% ~12s          
  |+++++++++                                         | 17% ~12s          
  |++++++++++                                        | 18% ~11s          
  |++++++++++                                        | 19% ~12s          
  |+++++++++++                                       | 20% ~12s          
  |+++++++++++                                       | 21% ~12s          
  |++++++++++++                                      | 22% ~12s          
  |++++++++++++                                      | 23% ~11s          
  |+++++++++++++                                     | 24% ~11s          
  |+++++++++++++                                     | 26% ~11s          
  |++++++++++++++                                    | 27% ~11s          
  |++++++++++++++                                    | 28% ~11s          
  |+++++++++++++++                                   | 29% ~10s          
  |+++++++++++++++                                   | 30% ~10s          
  |++++++++++++++++                                  | 31% ~10s          
  |++++++++++++++++                                  | 32% ~10s          
  |+++++++++++++++++                                 | 33% ~10s          
  |+++++++++++++++++                                 | 34% ~10s          
  |++++++++++++++++++                                | 35% ~10s          
  |++++++++++++++++++                                | 36% ~09s          
  |+++++++++++++++++++                               | 37% ~09s          
  |+++++++++++++++++++                               | 38% ~09s          
  |++++++++++++++++++++                              | 39% ~09s          
  |++++++++++++++++++++                              | 40% ~09s          
  |+++++++++++++++++++++                             | 41% ~09s          
  |+++++++++++++++++++++                             | 42% ~08s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |++++++++++++++++++++++                            | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~08s          
  |+++++++++++++++++++++++                           | 46% ~08s          
  |++++++++++++++++++++++++                          | 47% ~08s          
  |++++++++++++++++++++++++                          | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |+++++++++++++++++++++++++                         | 50% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |+++++++++++++++++++++++++++                       | 52% ~07s          
  |+++++++++++++++++++++++++++                       | 53% ~07s          
  |++++++++++++++++++++++++++++                      | 54% ~07s          
  |++++++++++++++++++++++++++++                      | 55% ~06s          
  |+++++++++++++++++++++++++++++                     | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |++++++++++++++++++++++++++++++                    | 58% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |+++++++++++++++++++++++++++++++                   | 60% ~06s          
  |+++++++++++++++++++++++++++++++                   | 61% ~06s          
  |++++++++++++++++++++++++++++++++                  | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |++++++++++++++++++++++++++++++++++                | 66% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=14s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~20s          
  |++                                                | 2 % ~20s          
  |++                                                | 3 % ~20s          
  |+++                                               | 4 % ~20s          
  |+++                                               | 5 % ~19s          
  |++++                                              | 6 % ~19s          
  |++++                                              | 7 % ~19s          
  |+++++                                             | 8 % ~19s          
  |+++++                                             | 9 % ~19s          
  |++++++                                            | 10% ~19s          
  |++++++                                            | 11% ~18s          
  |+++++++                                           | 12% ~18s          
  |+++++++                                           | 13% ~18s          
  |++++++++                                          | 14% ~18s          
  |++++++++                                          | 15% ~18s          
  |+++++++++                                         | 16% ~17s          
  |+++++++++                                         | 18% ~17s          
  |++++++++++                                        | 19% ~17s          
  |++++++++++                                        | 20% ~17s          
  |+++++++++++                                       | 21% ~17s          
  |+++++++++++                                       | 22% ~16s          
  |++++++++++++                                      | 23% ~16s          
  |++++++++++++                                      | 24% ~16s          
  |+++++++++++++                                     | 25% ~16s          
  |+++++++++++++                                     | 26% ~15s          
  |++++++++++++++                                    | 27% ~15s          
  |++++++++++++++                                    | 28% ~15s          
  |+++++++++++++++                                   | 29% ~15s          
  |+++++++++++++++                                   | 30% ~15s          
  |++++++++++++++++                                  | 31% ~14s          
  |++++++++++++++++                                  | 32% ~14s          
  |+++++++++++++++++                                 | 33% ~14s          
  |++++++++++++++++++                                | 34% ~14s          
  |++++++++++++++++++                                | 35% ~13s          
  |+++++++++++++++++++                               | 36% ~13s          
  |+++++++++++++++++++                               | 37% ~13s          
  |++++++++++++++++++++                              | 38% ~13s          
  |++++++++++++++++++++                              | 39% ~13s          
  |+++++++++++++++++++++                             | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~12s          
  |++++++++++++++++++++++                            | 42% ~12s          
  |++++++++++++++++++++++                            | 43% ~12s          
  |+++++++++++++++++++++++                           | 44% ~12s          
  |+++++++++++++++++++++++                           | 45% ~11s          
  |++++++++++++++++++++++++                          | 46% ~11s          
  |++++++++++++++++++++++++                          | 47% ~11s          
  |+++++++++++++++++++++++++                         | 48% ~11s          
  |+++++++++++++++++++++++++                         | 49% ~11s          
  |++++++++++++++++++++++++++                        | 51% ~10s          
  |++++++++++++++++++++++++++                        | 52% ~10s          
  |+++++++++++++++++++++++++++                       | 53% ~10s          
  |+++++++++++++++++++++++++++                       | 54% ~10s          
  |++++++++++++++++++++++++++++                      | 55% ~09s          
  |++++++++++++++++++++++++++++                      | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~09s          
  |+++++++++++++++++++++++++++++                     | 58% ~09s          
  |++++++++++++++++++++++++++++++                    | 59% ~09s          
  |++++++++++++++++++++++++++++++                    | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |+++++++++++++++++++++++++++++++                   | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 63% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=21s  
Calculating cluster 7

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~12s          
  |++                                                | 2 % ~12s          
  |++                                                | 3 % ~12s          
  |+++                                               | 4 % ~12s          
  |+++                                               | 5 % ~11s          
  |++++                                              | 7 % ~11s          
  |++++                                              | 8 % ~11s          
  |+++++                                             | 9 % ~11s          
  |+++++                                             | 10% ~11s          
  |++++++                                            | 11% ~11s          
  |+++++++                                           | 12% ~10s          
  |+++++++                                           | 13% ~10s          
  |++++++++                                          | 14% ~10s          
  |++++++++                                          | 15% ~10s          
  |+++++++++                                         | 16% ~10s          
  |+++++++++                                         | 18% ~10s          
  |++++++++++                                        | 19% ~10s          
  |++++++++++                                        | 20% ~10s          
  |+++++++++++                                       | 21% ~10s          
  |+++++++++++                                       | 22% ~09s          
  |++++++++++++                                      | 23% ~09s          
  |+++++++++++++                                     | 24% ~09s          
  |+++++++++++++                                     | 25% ~09s          
  |++++++++++++++                                    | 26% ~09s          
  |++++++++++++++                                    | 27% ~09s          
  |+++++++++++++++                                   | 29% ~09s          
  |+++++++++++++++                                   | 30% ~09s          
  |++++++++++++++++                                  | 31% ~08s          
  |++++++++++++++++                                  | 32% ~08s          
  |+++++++++++++++++                                 | 33% ~08s          
  |++++++++++++++++++                                | 34% ~08s          
  |++++++++++++++++++                                | 35% ~08s          
  |+++++++++++++++++++                               | 36% ~08s          
  |+++++++++++++++++++                               | 37% ~08s          
  |++++++++++++++++++++                              | 38% ~07s          
  |++++++++++++++++++++                              | 40% ~07s          
  |+++++++++++++++++++++                             | 41% ~07s          
  |+++++++++++++++++++++                             | 42% ~07s          
  |++++++++++++++++++++++                            | 43% ~07s          
  |++++++++++++++++++++++                            | 44% ~07s          
  |+++++++++++++++++++++++                           | 45% ~07s          
  |++++++++++++++++++++++++                          | 46% ~07s          
  |++++++++++++++++++++++++                          | 47% ~06s          
  |+++++++++++++++++++++++++                         | 48% ~06s          
  |+++++++++++++++++++++++++                         | 49% ~06s          
  |++++++++++++++++++++++++++                        | 51% ~06s          
  |++++++++++++++++++++++++++                        | 52% ~06s          
  |+++++++++++++++++++++++++++                       | 53% ~06s          
  |+++++++++++++++++++++++++++                       | 54% ~06s          
  |++++++++++++++++++++++++++++                      | 55% ~05s          
  |+++++++++++++++++++++++++++++                     | 56% ~05s          
  |+++++++++++++++++++++++++++++                     | 57% ~05s          
  |++++++++++++++++++++++++++++++                    | 58% ~05s          
  |++++++++++++++++++++++++++++++                    | 59% ~05s          
  |+++++++++++++++++++++++++++++++                   | 60% ~05s          
  |+++++++++++++++++++++++++++++++                   | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |++++++++++++++++++++++++++++++++                  | 64% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~04s          
  |++++++++++++++++++++++++++++++++++                | 67% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=12s  
Calculating cluster 8

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~10s          
  |++                                                | 2 % ~10s          
  |++                                                | 3 % ~10s          
  |+++                                               | 4 % ~10s          
  |+++                                               | 5 % ~09s          
  |++++                                              | 6 % ~09s          
  |++++                                              | 7 % ~09s          
  |+++++                                             | 9 % ~09s          
  |+++++                                             | 10% ~09s          
  |++++++                                            | 11% ~08s          
  |++++++                                            | 12% ~08s          
  |+++++++                                           | 13% ~08s          
  |+++++++                                           | 14% ~08s          
  |++++++++                                          | 15% ~08s          
  |++++++++                                          | 16% ~08s          
  |+++++++++                                         | 17% ~08s          
  |++++++++++                                        | 18% ~08s          
  |++++++++++                                        | 19% ~08s          
  |+++++++++++                                       | 20% ~07s          
  |+++++++++++                                       | 21% ~07s          
  |++++++++++++                                      | 22% ~07s          
  |++++++++++++                                      | 23% ~07s          
  |+++++++++++++                                     | 24% ~07s          
  |+++++++++++++                                     | 26% ~07s          
  |++++++++++++++                                    | 27% ~07s          
  |++++++++++++++                                    | 28% ~07s          
  |+++++++++++++++                                   | 29% ~07s          
  |+++++++++++++++                                   | 30% ~07s          
  |++++++++++++++++                                  | 31% ~06s          
  |++++++++++++++++                                  | 32% ~06s          
  |+++++++++++++++++                                 | 33% ~06s          
  |++++++++++++++++++                                | 34% ~06s          
  |++++++++++++++++++                                | 35% ~06s          
  |+++++++++++++++++++                               | 36% ~06s          
  |+++++++++++++++++++                               | 37% ~06s          
  |++++++++++++++++++++                              | 38% ~06s          
  |++++++++++++++++++++                              | 39% ~06s          
  |+++++++++++++++++++++                             | 40% ~06s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |++++++++++++++++++++++                            | 44% ~05s          
  |+++++++++++++++++++++++                           | 45% ~05s          
  |+++++++++++++++++++++++                           | 46% ~05s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |++++++++++++++++++++++++                          | 48% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |+++++++++++++++++++++++++                         | 50% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |+++++++++++++++++++++++++++                       | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |++++++++++++++++++++++++++++                      | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |+++++++++++++++++++++++++++++                     | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |++++++++++++++++++++++++++++++                    | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~04s          
  |+++++++++++++++++++++++++++++++                   | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=09s  
Calculating cluster 9

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~18s          
  |+                                                 | 2 % ~17s          
  |++                                                | 3 % ~17s          
  |++                                                | 4 % ~16s          
  |+++                                               | 5 % ~16s          
  |+++                                               | 6 % ~16s          
  |++++                                              | 7 % ~16s          
  |++++                                              | 8 % ~15s          
  |+++++                                             | 9 % ~15s          
  |+++++                                             | 10% ~15s          
  |++++++                                            | 11% ~15s          
  |++++++                                            | 12% ~15s          
  |+++++++                                           | 13% ~15s          
  |+++++++                                           | 14% ~14s          
  |++++++++                                          | 15% ~14s          
  |++++++++                                          | 16% ~14s          
  |+++++++++                                         | 17% ~14s          
  |+++++++++                                         | 18% ~14s          
  |++++++++++                                        | 19% ~14s          
  |++++++++++                                        | 20% ~13s          
  |+++++++++++                                       | 21% ~13s          
  |+++++++++++                                       | 22% ~13s          
  |++++++++++++                                      | 23% ~13s          
  |++++++++++++                                      | 24% ~13s          
  |+++++++++++++                                     | 25% ~13s          
  |+++++++++++++                                     | 26% ~12s          
  |++++++++++++++                                    | 27% ~12s          
  |++++++++++++++                                    | 28% ~12s          
  |+++++++++++++++                                   | 29% ~12s          
  |+++++++++++++++                                   | 30% ~12s          
  |++++++++++++++++                                  | 31% ~12s          
  |++++++++++++++++                                  | 32% ~11s          
  |+++++++++++++++++                                 | 33% ~11s          
  |+++++++++++++++++                                 | 34% ~11s          
  |++++++++++++++++++                                | 35% ~11s          
  |++++++++++++++++++                                | 36% ~11s          
  |+++++++++++++++++++                               | 37% ~11s          
  |+++++++++++++++++++                               | 38% ~10s          
  |++++++++++++++++++++                              | 39% ~10s          
  |++++++++++++++++++++                              | 40% ~10s          
  |+++++++++++++++++++++                             | 41% ~10s          
  |+++++++++++++++++++++                             | 42% ~10s          
  |++++++++++++++++++++++                            | 43% ~10s          
  |++++++++++++++++++++++                            | 44% ~09s          
  |+++++++++++++++++++++++                           | 45% ~09s          
  |+++++++++++++++++++++++                           | 46% ~09s          
  |++++++++++++++++++++++++                          | 47% ~09s          
  |++++++++++++++++++++++++                          | 48% ~09s          
  |+++++++++++++++++++++++++                         | 49% ~09s          
  |+++++++++++++++++++++++++                         | 50% ~08s          
  |++++++++++++++++++++++++++                        | 51% ~08s          
  |++++++++++++++++++++++++++                        | 52% ~08s          
  |+++++++++++++++++++++++++++                       | 53% ~08s          
  |+++++++++++++++++++++++++++                       | 54% ~08s          
  |++++++++++++++++++++++++++++                      | 55% ~08s          
  |++++++++++++++++++++++++++++                      | 56% ~07s          
  |+++++++++++++++++++++++++++++                     | 57% ~07s          
  |+++++++++++++++++++++++++++++                     | 58% ~07s          
  |++++++++++++++++++++++++++++++                    | 59% ~07s          
  |++++++++++++++++++++++++++++++                    | 60% ~07s          
  |+++++++++++++++++++++++++++++++                   | 61% ~07s          
  |+++++++++++++++++++++++++++++++                   | 62% ~06s          
  |++++++++++++++++++++++++++++++++                  | 63% ~06s          
  |++++++++++++++++++++++++++++++++                  | 64% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~06s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |++++++++++++++++++++++++++++++++++                | 68% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=17s  
Calculating cluster 10

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~19s          
  |++                                                | 2 % ~19s          
  |++                                                | 3 % ~19s          
  |+++                                               | 4 % ~19s          
  |+++                                               | 5 % ~18s          
  |++++                                              | 6 % ~18s          
  |++++                                              | 7 % ~18s          
  |+++++                                             | 8 % ~18s          
  |+++++                                             | 9 % ~18s          
  |++++++                                            | 10% ~17s          
  |++++++                                            | 11% ~17s          
  |+++++++                                           | 12% ~17s          
  |+++++++                                           | 13% ~17s          
  |++++++++                                          | 14% ~17s          
  |++++++++                                          | 15% ~16s          
  |+++++++++                                         | 16% ~16s          
  |+++++++++                                         | 18% ~16s          
  |++++++++++                                        | 19% ~16s          
  |++++++++++                                        | 20% ~15s          
  |+++++++++++                                       | 21% ~15s          
  |+++++++++++                                       | 22% ~15s          
  |++++++++++++                                      | 23% ~15s          
  |++++++++++++                                      | 24% ~15s          
  |+++++++++++++                                     | 25% ~15s          
  |+++++++++++++                                     | 26% ~14s          
  |++++++++++++++                                    | 27% ~14s          
  |++++++++++++++                                    | 28% ~14s          
  |+++++++++++++++                                   | 29% ~14s          
  |+++++++++++++++                                   | 30% ~13s          
  |++++++++++++++++                                  | 31% ~13s          
  |++++++++++++++++                                  | 32% ~13s          
  |+++++++++++++++++                                 | 33% ~13s          
  |++++++++++++++++++                                | 34% ~13s          
  |++++++++++++++++++                                | 35% ~12s          
  |+++++++++++++++++++                               | 36% ~12s          
  |+++++++++++++++++++                               | 37% ~12s          
  |++++++++++++++++++++                              | 38% ~12s          
  |++++++++++++++++++++                              | 39% ~12s          
  |+++++++++++++++++++++                             | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~11s          
  |++++++++++++++++++++++                            | 42% ~11s          
  |++++++++++++++++++++++                            | 43% ~11s          
  |+++++++++++++++++++++++                           | 44% ~11s          
  |+++++++++++++++++++++++                           | 45% ~10s          
  |++++++++++++++++++++++++                          | 46% ~10s          
  |++++++++++++++++++++++++                          | 47% ~10s          
  |+++++++++++++++++++++++++                         | 48% ~10s          
  |+++++++++++++++++++++++++                         | 49% ~10s          
  |++++++++++++++++++++++++++                        | 51% ~09s          
  |++++++++++++++++++++++++++                        | 52% ~09s          
  |+++++++++++++++++++++++++++                       | 53% ~09s          
  |+++++++++++++++++++++++++++                       | 54% ~09s          
  |++++++++++++++++++++++++++++                      | 55% ~09s          
  |++++++++++++++++++++++++++++                      | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~08s          
  |+++++++++++++++++++++++++++++                     | 58% ~08s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |++++++++++++++++++++++++++++++                    | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |+++++++++++++++++++++++++++++++                   | 62% ~07s          
  |++++++++++++++++++++++++++++++++                  | 63% ~07s          
  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=19s  
Calculating cluster 11

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~09s          
  |++                                                | 2 % ~08s          
  |++                                                | 3 % ~08s          
  |+++                                               | 5 % ~08s          
  |+++                                               | 6 % ~08s          
  |++++                                              | 7 % ~07s          
  |++++                                              | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |++++++                                            | 10% ~07s          
  |++++++                                            | 11% ~07s          
  |+++++++                                           | 12% ~07s          
  |+++++++                                           | 14% ~07s          
  |++++++++                                          | 15% ~07s          
  |++++++++                                          | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |++++++++++                                        | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |+++++++++++                                       | 20% ~06s          
  |+++++++++++                                       | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |++++++++++++                                      | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |++++++++++++++                                    | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |+++++++++++++++                                   | 28% ~05s          
  |+++++++++++++++                                   | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 36% ~05s          
  |+++++++++++++++++++                               | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |++++++++++++++++++++                              | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |++++++++++++++++++++++++                          | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |+++++++++++++++++++++++++                         | 50% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |+++++++++++++++++++++++++++                       | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |+++++++++++++++++++++++++++++++                   | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |++++++++++++++++++++++++++++++++                  | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
Calculating cluster 12

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~15s          
  |++                                                | 2 % ~14s          
  |++                                                | 3 % ~14s          
  |+++                                               | 4 % ~14s          
  |+++                                               | 5 % ~14s          
  |++++                                              | 6 % ~13s          
  |++++                                              | 7 % ~13s          
  |+++++                                             | 9 % ~13s          
  |+++++                                             | 10% ~13s          
  |++++++                                            | 11% ~13s          
  |++++++                                            | 12% ~13s          
  |+++++++                                           | 13% ~12s          
  |+++++++                                           | 14% ~12s          
  |++++++++                                          | 15% ~12s          
  |++++++++                                          | 16% ~12s          
  |+++++++++                                         | 17% ~12s          
  |++++++++++                                        | 18% ~12s          
  |++++++++++                                        | 19% ~11s          
  |+++++++++++                                       | 20% ~11s          
  |+++++++++++                                       | 21% ~11s          
  |++++++++++++                                      | 22% ~11s          
  |++++++++++++                                      | 23% ~11s          
  |+++++++++++++                                     | 24% ~11s          
  |+++++++++++++                                     | 26% ~10s          
  |++++++++++++++                                    | 27% ~10s          
  |++++++++++++++                                    | 28% ~10s          
  |+++++++++++++++                                   | 29% ~10s          
  |+++++++++++++++                                   | 30% ~10s          
  |++++++++++++++++                                  | 31% ~10s          
  |++++++++++++++++                                  | 32% ~09s          
  |+++++++++++++++++                                 | 33% ~09s          
  |++++++++++++++++++                                | 34% ~09s          
  |++++++++++++++++++                                | 35% ~09s          
  |+++++++++++++++++++                               | 36% ~09s          
  |+++++++++++++++++++                               | 37% ~09s          
  |++++++++++++++++++++                              | 38% ~09s          
  |++++++++++++++++++++                              | 39% ~08s          
  |+++++++++++++++++++++                             | 40% ~08s          
  |+++++++++++++++++++++                             | 41% ~08s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |++++++++++++++++++++++                            | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~08s          
  |+++++++++++++++++++++++                           | 46% ~08s          
  |++++++++++++++++++++++++                          | 47% ~08s          
  |++++++++++++++++++++++++                          | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |+++++++++++++++++++++++++                         | 50% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |+++++++++++++++++++++++++++                       | 52% ~07s          
  |+++++++++++++++++++++++++++                       | 53% ~07s          
  |++++++++++++++++++++++++++++                      | 54% ~06s          
  |++++++++++++++++++++++++++++                      | 55% ~06s          
  |+++++++++++++++++++++++++++++                     | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |++++++++++++++++++++++++++++++                    | 60% ~06s          
  |+++++++++++++++++++++++++++++++                   | 61% ~06s          
  |+++++++++++++++++++++++++++++++                   | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |++++++++++++++++++++++++++++++++                  | 64% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=14s  
Calculating cluster 13

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~07s          
  |+                                                 | 2 % ~07s          
  |++                                                | 3 % ~07s          
  |++                                                | 4 % ~07s          
  |+++                                               | 5 % ~07s          
  |+++                                               | 6 % ~07s          
  |++++                                              | 7 % ~07s          
  |++++                                              | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |+++++                                             | 10% ~07s          
  |++++++                                            | 11% ~07s          
  |++++++                                            | 12% ~07s          
  |+++++++                                           | 13% ~07s          
  |+++++++                                           | 14% ~06s          
  |++++++++                                          | 15% ~06s          
  |++++++++                                          | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |+++++++++                                         | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |++++++++++                                        | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |+++++++++++                                       | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |++++++++++++                                      | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |+++++++++++++                                     | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |++++++++++++++                                    | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |+++++++++++++++                                   | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |+++++++++++++++++                                 | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |++++++++++++++++++                                | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |+++++++++++++++++++                               | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |++++++++++++++++++++                              | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |+++++++++++++++++++++                             | 42% ~05s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |++++++++++++++++++++++                            | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |+++++++++++++++++++++++                           | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |++++++++++++++++++++++++                          | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |+++++++++++++++++++++++++                         | 50% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
# optional: save the cluster markers
#write.csv(ClusterMarkers,"ClusterMarkers.csv")

See the top cluster markers

Now we can look at the cluster markers for cluster using EnrichR to compare to reference libraries



setEnrichrSite("Enrichr") # Human genes
Connection changed to https://maayanlab.cloud/Enrichr/
Connection is Live!
# list of all the databases

dbs <- listEnrichrDbs()

# this will list the possible libraries
dbs

# select libraries with cell types
db <- c('CellMarker_Augmented_2021','Azimuth_Cell_Types_2021')

Here is a small function to run easily on each cluster and find the cell type library predictions (specific to the libraries I selected)


checkCelltypes <- function(cluster_num = 0){
  clusterX <- ClusterMarkers %>% filter(cluster == cluster_num & avg_log2FC > 0.25)
  genes <- clusterX$gene
  # the cell type libraries
  # get the results for each library
  clusterX.cell <- enrichr(genes, databases = db)
  # visulize the results
print(plotEnrich(clusterX.cell[[1]], showTerms = 20, numChar = 40, y = "Count", orderBy = "P.value", title = 'CellMarker_Augmented_2021'))
print(plotEnrich(clusterX.cell[[2]], showTerms = 20, numChar = 40, y = "Count", orderBy = "P.value", title = 'Azimuth_Cell_Types_2021'))

}

Run the function for each cluster to see if we can identify cell types


cluster0 <- checkCelltypes(cluster_num = 0)
Uploading data to Enrichr... Done.
  Querying CellMarker_Augmented_2021... Done.
  Querying Azimuth_Cell_Types_2021... Done.
Parsing results... Done.

Cluster 0 is likely immature neurons - possibly both Glutamatergic and gabaergic

Cluster 1 is astrocytes


checkCelltypes(cluster_num = 11)
Uploading data to Enrichr... Done.
  Querying CellMarker_Augmented_2021... Done.
  Querying Azimuth_Cell_Types_2021... Done.
Parsing results... Done.

After we have looked at all the clusters we add manual annotations

levels(integrated_seurat)
 [1] "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13"

Lets look at the annotations on the UMAP


DimPlot(integrated_seurat, group.by = "CellTypes", label = TRUE)

BREAK

Automated annotation We require reference data objects for both methods we will use


# developing forebrain
devforebrain <- readRDS("/Users/rhalenathomas/Documents/Data/scRNAseq/PublicData/Karolinski_DevForebrain_downsample_Level1.RDS")

# developing cortex

devcotex <- readRDS("/Users/rhalenathomas/Documents/Data/scRNAseq/PublicData/Nowakowski_dev_cortext.RDS")

# adult midbrain

midbrain <- readRDS("/Users/rhalenathomas/Documents/Data/scRNAseq/PublicData/KamathTotal_downsample.RDS")

#check the meta data
print("Developing Forebrain")
[1] "Developing Forebrain"
colnames(devforebrain@meta.data)
[1] "orig.ident"   "nCount_RNA"   "nFeature_RNA" "Sample"       "Level1"       "Age"         
[7] "Clusters"     "New"          "Celltypes"   
print("Developing cortex")
[1] "Developing cortex"
colnames(devcotex@meta.data)
 [1] "orig.ident"   "nCount_RNA"   "nFeature_RNA" "WGCNAcluster" "Name"         "Age_in_Weeks"
 [7] "RegionName"   "Laminae"      "Area"         "Celltypes"   
print("Adult midbrain")
[1] "Adult midbrain"
colnames(midbrain@meta.data)
[1] "orig.ident"              "nCount_RNA"              "nFeature_RNA"           
[4] "Cell_Subtype"            "Cell_Type"               "disease__ontology_label"
[7] "organ__ontology_label"  
# we need to know the metadata slot name to use

Seurat label transfer using find anchors - predicts cell types from a reference Seurat object

scClassify R weighted kNN https://doi.org/10.15252/msb.20199389 https://sydneybiox.github.io/scClassify/articles/scClassify.html

We need to make the reference and query objects into a “dgCMatrix” object

length(query_clusters)
[1] 4028

See the original cell type annotations

query_celltypes[1:10]
AAACCCAAGAGCTTTC-1_1 AAACCCACATTGACTG-1_1 AAACCCAGTTTGGAAA-1_1 AAACCCATCATCGACA-1_1 
    neurons_immature         astrocytes_1        endothelial_2          astrocyte_2 
AAACGAAAGCCTGAAG-1_1 AAACGAAAGGAGAATG-1_1 AAACGAACACGCGTGT-1_1 AAACGCTCACGTTCGG-1_1 
       endothelial_1            DAneurons       neurons_mature       neurons_mature 
AAACGCTGTTGTCAGT-1_1 AAAGAACAGGTAGGCT-1_1 
        neurons_GABA       neurons_mature 
14 Levels: neurons_immature astrocytes_1 glia neurons_mature OPC ... DAneurons

Run scClassify


scClassify_res <- scClassify(exprsMat_train = dgCMat_ref,
                             cellTypes_train = ref_celltypes,
                             exprsMat_test = dgCMat_query,
                             cellTypes_test = query_celltypes,
                             tree = "HOPACH",
                             algorithm = "WKNN",
                             selectFeatures = c("limma"),
                             similarity = c("pearson"),
                             returnList = FALSE,
                             verbose = FALSE)
Warning in asMethod(object) :
  sparse->dense coercion: allocating vector of size 2.4 GiB


plotCellTypeTree(cellTypeTree(scClassify_res$trainRes))
Warning: Removed 27 rows containing missing values (`geom_text()`).

See the cell type predictions by cluster

table(scClassify_res$testRes$test$pearson_WKNN_limma$predRes,query_celltypes)
                                            query_celltypes
                                             neurons_immature astrocytes_1 glia
  EN                                                       76            0    5
  Endothelial                                               0            0    0
  Glioblast                                                 0            0    0
  IN                                                      320            0    0
  Neuroblast                                               17            0    1
  Neuroblast_IN_EN                                        141            0    3
  Neuroblast_IN_EN_Neurons_U                                8            0    0
  Neuroblast_IN_EN_NPC_Endothelial_Neurons_U                0            0    0
  Neuroblast_IN_EN_NPC_Neurons_U                            0            0    0
  Neurons                                                   0            0    0
  NPC                                                       0            0    0
  OPC                                                       0            0    1
  Pre-OPC                                                   0          462  204
  RG                                                        0            2   66
  RG_Glioblast                                              0            0    1
  RG_Glioblast_OPC_Pre-OPC                                  0            0    1
  RG_Glioblast_Pre-OPC                                      0           51  127
  U                                                         0            0    0
  unassigned                                                4            3   29
  VLMC                                                      0            0    0
                                            query_celltypes
                                             neurons_mature OPC endothelial_1 endothelial_2
  EN                                                     18   7             9           178
  Endothelial                                             0   0             0             0
  Glioblast                                               0   1             7             2
  IN                                                    280   0             0             7
  Neuroblast                                              0   1             1             2
  Neuroblast_IN_EN                                       90   4             2            22
  Neuroblast_IN_EN_Neurons_U                              0   0             0             1
  Neuroblast_IN_EN_NPC_Endothelial_Neurons_U              0   0             0             1
  Neuroblast_IN_EN_NPC_Neurons_U                          0   0             2             1
  Neurons                                                 0   0             0             1
  NPC                                                     0   0             0             0
  OPC                                                     0   6             0             0
  Pre-OPC                                                 0 171            23             0
  RG                                                      0  24           122            15
  RG_Glioblast                                            0   7            30             3
  RG_Glioblast_OPC_Pre-OPC                                0   9             0             0
  RG_Glioblast_Pre-OPC                                    0  53            12             0
  U                                                       0   0             0             0
  unassigned                                              1  24            72            22
  VLMC                                                    0   0             0             0
                                            query_celltypes
                                             astrocyte_2 RadialGlia neurons1 neurons_GABA
  EN                                                   4          0      202           50
  Endothelial                                          0          0        0            1
  Glioblast                                            2          0        0            1
  IN                                                   0          0        0           80
  Neuroblast                                           0          0        4            6
  Neuroblast_IN_EN                                     3          2       11           50
  Neuroblast_IN_EN_Neurons_U                           0          0        8            0
  Neuroblast_IN_EN_NPC_Endothelial_Neurons_U           0          0        0            0
  Neuroblast_IN_EN_NPC_Neurons_U                       0          0        0            2
  Neurons                                              1          0        0            0
  NPC                                                  0          0        0            0
  OPC                                                  0          0        0            0
  Pre-OPC                                            144         60        0            1
  RG                                                  19         89        0            3
  RG_Glioblast                                        13         17        0            1
  RG_Glioblast_OPC_Pre-OPC                             5          1        0            0
  RG_Glioblast_Pre-OPC                                45         37        0            1
  U                                                    0          0        2            0
  unassigned                                          17         13        0           12
  VLMC                                                 0          8        0            0
                                            query_celltypes
                                             neurons2 neural_stem DAneurons
  EN                                              102           0        63
  Endothelial                                       0           0         0
  Glioblast                                         0           2         0
  IN                                                4           2         0
  Neuroblast                                       15           0         0
  Neuroblast_IN_EN                                 64           0         3
  Neuroblast_IN_EN_Neurons_U                        1           0         0
  Neuroblast_IN_EN_NPC_Endothelial_Neurons_U        0           0         0
  Neuroblast_IN_EN_NPC_Neurons_U                    3           0         2
  Neurons                                           0           0         0
  NPC                                               2           0         0
  OPC                                               0           2         0
  Pre-OPC                                           0           4         0
  RG                                                0          61         0
  RG_Glioblast                                      0          10         0
  RG_Glioblast_OPC_Pre-OPC                          0           0         0
  RG_Glioblast_Pre-OPC                              0          11         0
  U                                                 0           0         0
  unassigned                                        1           6         2
  VLMC                                              0           0         0

Check another reference set

# refrence data
# we have the data prepared as a Seurat object

ref2 <- midbrain
ref2

#check the meta data
colnames(ref2@meta.data)

#make the reference matrix and reference cell types 


dgCMat_ref2 <- GetAssayData(ref2)
# get the cell type data
Idents(ref2) <- "Cell_Type" 
ref_celltypes2 <- Idents(ref2)
unique(ref_celltypes2)

# check the object
dim(dgCMat_ref2)


class(dgCMat_ref2)
# predict the cluster cell types from the second reference
scClassify_res <- scClassify(exprsMat_train = dgCMat_ref2,
                             cellTypes_train = ref_celltypes2,
                             exprsMat_test = dgCMat_query,
                             cellTypes_test = query_clusters,
                             tree = "HOPACH",
                             algorithm = "WKNN",
                             selectFeatures = c("limma"),
                             similarity = c("pearson"),
                             returnList = FALSE,
                             verbose = FALSE)
Sys.time()

plotCellTypeTree(cellTypeTree(scClassify_res$trainRes))

See the predictions by cluster

table(scClassify_res$testRes$test$pearson_WKNN_limma$predRes,query_clusters)
# reformat to see the top predictions for each cluster

pred_counts <- as.data.frame(table(query_clusters,scClassify_res$testRes$test$pearson_WKNN_limma$predRes))

pred_counts$Freq <- as.double(pred_counts$Freq)

head(pred_counts)
# see predictions by cluster in a table
top.pred <- as.data.frame(pred_counts  %>% group_by(query_clusters)  %>% top_n(2, Freq)) %>% arrange(query_clusters, desc(Freq))
top.pred

Add prediction annotations

Adjust annotations - merge clusters or not

LS0tCnRpdGxlOiAic2NSTkFzZXEgV29ya2Zsb3ciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRoaXMgd29ya2Jvb2sgaW5jbHVkZXM6CjEuIENyZWF0aW5nIGEgU2V1cmF0IG9iamVjdCBmcm9tIENlbGxSYW5nZXIgb3V0cHV0LgoyLiBQcmVwYXJpbmcgYW5kIGNsZWFuaW5nIHRoZSBkYXRhCiAgYSkgVmlzdWFsaXplIFFDCiAgYikgRmlsdGVyIG91dCB1bndhbnRlZCBjZWxscwogIGMpIElkZW50aWZ5IGFuZCByZW1vdmUgZG91YmxldHMKICBkKSBOb3JtYWxpemF0aW9uIGFuZCBzY2FsZQogIGUpIFNlbGVjdCBWYXJpYWJsZSBmZWF0dXJlcwozLiBNZXJnaW5nIGFuZCBIYXJtb25pemluZyBzYW1wbGVzCiAgYSkgTWVyZ2Ugc2FtcGxlcwogIGIpIFVzZSBTZXVyYXQgZmluZCBhbmNob3JzIHRvIGludGVncmF0ZQogIGMpIENvbXBhcmUgbWVyZ2VkIHZzIGludGVncmF0ZWQKNC4gRGltZW5zaW9uYWwgcmVkdWN0aW9uIGNsdXN0ZXJpbmcgYW5kIHZpc3VhbGl6YXRpb24KICBhKSBQQ0EgYW5kIGNvbXBvbmVudCBzZWxlY3Rpb24KICBiKSBVTUFQCiAgYykgQ2x1c3RlcmluZyBhbmQgdmlzdWFsaXphdGlvbgo1LiBDbHVzdGVyIGFubm90YXRpb24KICBhKSBWaXN1YWxpemUgZXhwcmVzc2lvbiBvZiBrbm93biBjZWxsIHR5cGUgbWFya2VycwogIGIpIEZpbmQgY2x1c3RlciBtYXJrZXJzIGFuZCBsb29rIHRoZW0gdXAgaW4gcmVmZXJlbmNlIGNlbGwgdHlwZSBsaWJyYXJ5CiAgYykgTWFudWFsIGNsdXN0ZXIgYW5ub3RhdGlvbiAKICBkKSBEZWNpc2lvbnMgb24gbWVyZ2luZyBjbHVzdGVycwo2LiBBdXRvbWF0ZWQgY2x1c3RlciBhbm5vdGF0aW9uCiAgYSkgU2V1cmF0IGxhYmVsIHRyYW5zZmVyCiAgYikgc2NDbGFzc2lmeQoKCiMgRXhhbXBsZSBkYXRhCldlIHdpbGwgdXNlIGRhdGEgZnJvbSBpUFNDIGRlcml2ZWQgbWlkYnJhaW4gb3JnYW5vaWRzClRoZXJlIGFyZSB0d28gc2FtcGxlcyBmcm9tIGRpc3NvY2lhdGVkIG1pZGJyYWluIG9yZ2Fub2lkcwoxKSBpUFNDIGxpbmUgZnJvbSBhIHBhdGllbnQgd2l0aCBQYXJraW5zb24ncyBEaXNlYXNlIGNhcnJ5aW5nIGEgdHJpcGxpY2F0aW9uIG9mIHRoZSBnZW5lIFNOQ0EKMikgVGhlIHNhbWUgaVBTQyBsaW5lIENSSVNQUiBjb3JyZWN0ZWQgdG8gbWFrZSBhbiBpc29nZW5lbmljIGNvbnRyb2wKCgojIEFuYWx5c2lzIHdvcmtmbG93CgpMb2FkIHlvdXIgcmVxdWlyZWQgbGlicmFyaWVzLgpZb3UgbmVlZCB0byBoYXZlIHRoZXNlIGxpYnJhcmllcyBhbHJlYWR5IGluc3RhbGxlZC4gCgpgYGB7cn0KU3lzLnRpbWUoKQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoRG91YmxldEZpbmRlcikKbGlicmFyeShlbnJpY2hSKQpsaWJyYXJ5KGNsdXN0cmVlKQpsaWJyYXJ5KCJzY0NsYXNzaWZ5IikKbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKbGlicmFyeSgiTWF0cml4IikKCgpgYGAKCgpMb2FkIHRoZSBkYXRhOiBTdGFydGluZyB3aXRoIHRoZSBjb250cm9sIGRhdGEuCgpgYGB7cn0KIyBsb2FkIGRhdGEKCiMgcmVhZCBpbiB0aGUgZGF0YSAtIENlbGxSYW5nZXIgb3V0cHV0IC0gYmFyY29kZXMsIGZlYXR1cmVzLCBleHByZXNzaW9uIG1hdHJpeAoKIyB5b3UgbmVlZCB0byBlbnRlciB0aGUgZmlsZSBwYXRoIHRvIHRoZSBmb2xkZXIgd2l0aCB0aGUgdGhyZWUgZmlsZXMKY29uX2RhdGEgPC0gUmVhZDEwWCgiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvc2NSTkFzZXEvQVNUMjNfQnJhaW5Db21tL0NlbGxSYW5nZXJPdXRzL0FTVDIzaXNvZ2VuaWMvcmF3X2ZlYXR1cmVfYmNfbWF0cml4IikgCgojTG9vayBhdCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgbWF0cml4CmRpbShjb25fZGF0YSkKCiNMb29rIGF0IGEgc21hbGwgcGFydCBvZiB0aGUgZGF0YQpjb25fZGF0YVsxOjUsIDE6NV0KCiNMb29rIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZiBVTUlzIHBlciBjZWxsCmNvbFN1bXMoY29uX2RhdGEpICU+JSBzdW1tYXJ5CiNMb29rIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZiBnZW5lcyBwZXIgY2VsbCAgCmNvbFN1bXMoY29uX2RhdGEgPiAwKSAlPiUgc3VtbWFyeQoKCgpgYGAKCgpSZW1vdmUgYmFyY29kZXMgd2l0aCB0b28gZmV3IGdlbmVzIHRoYXQgY291bGQgYmUgZW1wdHkgZHJvcGxldHMKCmBgYHtyfQojUmVtb3ZlIGJhcmNvZGVzIHdpdGggbGVzcyB0aGFuIDEwMCBnZW5lcyBkZXRlY3RlZCAoeW91IGNhbiBzZWxlY3QgYSBkaWZmZXJlbnQgdmFsdWUgaGVyZSkKIyB3aXRob3V0IApjb25fZGF0YSA8LSBjb25fZGF0YVssIGNvbFN1bXMoY29uX2RhdGEgPiAwKT4gMTAwXQpkaW0oY29uX2RhdGEpCmNvbFN1bXMoY29uX2RhdGEpICU+JSBzdW1tYXJ5CgpgYGAKCgpGaWx0ZXIgZ2VuZXMgYW5kIGNyZWF0ZSBhIFNldXJhdCBvYmplY3QKCgpgYGB7cn0KI1dlIG1pZ2h0IG5vdCB3YW50IHRvIGluY2x1ZGUgZ2VuZXMgdGhhdCBvY2N1ciBpbiBmZXcgY2VsbHMgYXJlIG5vIGNlbGxzLiAgSGVyZSB3ZSB3aWxsIGZpbHRlciBvdXQgZ2VuZXMvdHJhbnNjcmlwdHMgdGhhdCBhcmUgaW4gbGVzcyB0aGFuIDMgY2VsbHMuIAojIHlvdSBkb24ndCBoYXZlIHRvIGZpbHRlciBhbnkgZ2VuZXMgeW91IGNhbiBhbHNvIGNoYW5nZSB0byBhbnkgZmlsdGVyIHRocmVzaG9sZCB5b3Ugd2FudAoKI01ha2UgYSBTZXVyYXQgb2JqZWN0CiNSZW1vdmluZyBhbnkgZ2VuZXMgZGV0ZWN0ZWQgaW4gbGVzcyB0aGFuIDMgY2VsbHMKCiMgd2UgY2FuIGFsc28gZmlsdGVyIGNlbGxzIGF0IHRoaXMgc3RhZ2UgdG9vLiAKY29uX3NldSA8LSBDcmVhdGVTZXVyYXRPYmplY3QoY29uX2RhdGEsIHByb2plY3QgPSAiQ29udHJvbCIsIG1pbi5jZWxscyA9IDMpCiMgbG9vayBhdCB0aGUgb2JqZWN0IGRpbWVuc2lvbnMKY29uX3NldQoKYGBgCgoKRGF0YSBkaXN0cmlidXRpb24KYGBge3J9CiMgbG9vayBhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRvdGFsIGNvdW50cyBvZiBSTkEgYWNyb3NzIGNlbGxzCmNvbl9zZXUkbkNvdW50X1JOQSAlPiUgc3VtbWFyeQoKIyBsb29rIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgdW5pcXVlIFJOQSB0cmFuc2NyaXB0cyBhY3Jvc3MgY2VsbHMKCmNvbl9zZXUkbkZlYXR1cmVfUk5BICU+JSBzdW1tYXJ5CgpgYGAKCgpWaXN1YWxpemUgdGhlIGRpc3RyaWJ1dGlvbnMKCmBgYHtyfQoKVmxuUGxvdChjb25fc2V1LCBmZWF0dXJlcyA9IGMoIm5Db3VudF9STkEiLCJuRmVhdHVyZV9STkEiKSwgcHQuc2l6ZSA9IDApCgpgYGAKCkZpbHRlciBvdXQgdW53YW50ZWQgY2VsbHMKCmBgYHtyfQojIEV4YW1wbGUgY2VsbCBmaWx0ZXJpbmcgYmFzZWQgb24gbWl0b2Nob25kcmlhbCBjb3VudCBwZXJjZW50YWdlIGFuZCBudW1iZXIgb2YgVU1JcyAtLS0tLS0tLS0tCgojQ2FsY3VsYXRlIHRoZSBwZXJjZW50YWdlIG9mIFJOQSBlbmNvZGVkIG1pdG9jaG9uZHJpYWwgZ2VuZXMgZnJvbSB0aGUgbWl0b2Nob25kcmlhbCBETkEKY29uX3NldSA8LSBQZXJjZW50YWdlRmVhdHVyZVNldChjb25fc2V1LCBwYXR0ZXJuID0gIl5NVC0iLCBjb2wubmFtZSA9ICJwZXJjZW50Lk1UIikKY29uX3NldSRwZXJjZW50Lk1UICU+JSBzdW1tYXJ5CgpWbG5QbG90KGNvbl9zZXUsIGZlYXR1cmVzID0gInBlcmNlbnQuTVQiLCBwdC5zaXplID0gMC4wMDEpCgpgYGAKTm93IHdlIHdpbGwgZmlsdGVyIHNvbWUgY2VsbHMgd2l0aCB0b28gaGlnaCBtaXRvY2hvbmRyaWFsIFJOQQpGaWx0ZXIgb3V0IGNlbGxzIHdpdGggdG9vIG1hbnkgUk5BIHJlYWRzIC0gdGhlc2UgYXJlIGxpa2VseSBkb3VibGV0cwoKYGBge3J9CgoKI1JlbW92ZSBhbnkgY2VsbHMgd2l0aCBtb3JlIHRoYW4gMjAlIG1pdG9jaG9uZHJpYWwgY291bnRzCmNvbl9zZXUuZnQgPC0gc3Vic2V0KGNvbl9zZXUsIHBlcmNlbnQuTVQgPCAyMCkKCiNSZW1vdmUgY2VsbHMgd2l0aCB2ZXJ5IGhpZ2ggVU1JIGNvdW50cywgd2hpY2ggbWF5IGJlIHBvc3NpYmxlIG11bHRpcGxldHMKY29uX3NldS5mdCA8LSBzdWJzZXQoY29uX3NldS5mdCwgbkNvdW50X1JOQSA8IDIwMDAwKQoKIyBzZWUgdGhlIHJlc3VsdHMKVmxuUGxvdChjb25fc2V1LmZ0LCBmZWF0dXJlcyA9IGMoInBlcmNlbnQuTVQiLCAibkNvdW50X1JOQSIsICJuRmVhdHVyZV9STkEiKSwgcHQuc2l6ZSA9IDAuMDAxKQoKIyBjaGVjayBob3cgbWFueSBjZWxscyB3ZSBoYXZlCmNvbl9zZXUuZnQKClZsblBsb3QoY29uX3NldS5mdCwgZmVhdHVyZXMgPSAibkZlYXR1cmVfUk5BIiwgcHQuc2l6ZSA9IDAuMDAxLCB5Lm1heCA9IDEwMDApCgoKYGBgCgpXZSBtaWdodCB3YW50IHRvIGZpbHRlciBtb3JlIGNlbGxzIHdpdGggbG93IHRvdGFsIGFuZC9vciB1bmlxdWUgUk5BCgpgYGB7cn0KCiMgdHJ5IHNvbWUgZGlmZmVyZW50IGZpbHRlcmluZyBvcHRpb25zCmNvbl9zZXUuZnQgPC0gc3Vic2V0KGNvbl9zZXUsIHBlcmNlbnQuTVQgPCAyMCkKZGltKGNvbl9zZXUpCmRpbShjb25fc2V1LmZ0KQoKCmBgYAoKQXBwbHkgZmluYWwgZmlsdGVyaW5nIGNvbmRpdGlvbnMKYGBge3J9Cgpjb25fc2V1X2Z0IDwtIHN1YnNldChjb25fc2V1LCBuQ291bnRfUk5BIDwgNjAwMDAgJiBuRmVhdHVyZV9STkEgPiA1MDAgJiAKICAgICAgICAgICAgICAgICAgICAgcGVyY2VudC5NVCA8IDIwKQoKZGltKGNvbl9zZXVfZnQpCgpgYGAKCkNsZWFyIGV4dHJhIGRhdGEgb2JqZWN0IHdlIGRvbid0IG5lZWQgYW55bW9yZQoKYGBge3J9CgpybShjb25fZGF0YSxjb25fc2V1LmZ0KQoKYGBgCgoKTm9ybWFsaXppbmcgCgpgYGB7cn0KIyBOb3JtYWxpemUgZGF0YSAobG9nIG5vcm1hbGl6YXRpb24pIGFuZCBzZWxlY3QgZ2VuZXMgd2l0aCB2YXJpYWJsZSBleHByZXNzaW9uIGFjcm9zcyBjZWxscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY29uX3NldV9mdCA8LSBOb3JtYWxpemVEYXRhKGNvbl9zZXVfZnQsIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIkxvZ05vcm1hbGl6ZSIsIHNjYWxlLmZhY3RvciA9IDEwMDAwKQoKI0NoZWNrIG91dCB0aGUgZWZmZWN0IG9mIG5vcm1hbGl6YXRpb24KR2V0QXNzYXlEYXRhKGNvbl9zZXVfZnQsIGFzc2F5ID0gIlJOQSIsIHNsb3QgPSAiZGF0YSIpICU+JSBleHBtMSAlPiUgY29sU3VtcyAlPiUgaGVhZApHZXRBc3NheURhdGEoY29uX3NldV9mdCwgYXNzYXkgPSAiUk5BIiwgc2xvdCA9ICJjb3VudHMiKSAlPiUgY29sU3VtcyAlPiUgaGVhZAoKYGBgCgpGaW5kaW5nIFZhcmlhYmxlIGZlYXR1cmVzIApgYGB7cn0KIyB0aHJlZSBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gY2hvb3NlIHZhcmlhYmxlIGZlYXR1cmVzIGluIHRoaXMgZnVuY3Rpb24KIyBvdXIgc2VsZWN0aW9uIG1ldGhvZCBpcyB2c3QKY29uX3NldV9mdCA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhjb25fc2V1X2Z0LCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCgoKdmFyICA8LSBWYXJpYWJsZUZlYXR1cmVzKGNvbl9zZXVfZnQpClZhcmlhYmxlRmVhdHVyZVBsb3QoY29uX3NldV9mdCkKdmFyWzE6MTBdCgoKCmBgYAoKRGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIFBDQSBhbmQgVU1BUAoKYGBge3J9CiNTY2FsaW5nIGlzIHJlY29tbWVuZGVkIGJlZm9yZSBQQ0EsIGFzIG90aGVyd2lzZSBoaWdobHkgZXhwcmVzc2VkIGdlbmVzIHdpbGwgaGF2ZSBhIGRpc3Byb3BvcnRpb25hdGUgZWZmZWN0IG9uIHRoZSBQQyBjb21wb3NpdGlvbgoKIyB3ZSBhcmUgYWxzbyByZWdyZXNzaW5nIE1UIGdlbmVzIHRvIHJlbW92ZSB0aGVtIGZyb20gdGhlIFBDQQpjb25fc2V1X2Z0IDwtIFNjYWxlRGF0YShjb25fc2V1X2Z0LCB2YXJzLnRvLnJlZ3Jlc3MgPSAicGVyY2VudC5NVCIpCmNvbl9zZXVfZnRAYXNzYXlzJFJOQUBzY2FsZS5kYXRhICU+JSBkaW0KCiNMaW5lYXIgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uCiNDaG9vc2luZyB0aGUgbnVtYmVyIG9mIFBDcyBjYW4gZGVwZW5kIG9uIGhvdyBtYW55IGNlbGxzIHlvdSBoYXZlCmNvbl9zZXVfZnQgPC0gUnVuUENBKGNvbl9zZXVfZnQsIGFzc2F5ID0gIlJOQSIsIG5wY3MgPSAzMCkKClBDQVBsb3QoY29uX3NldV9mdCkKCiNBc3Nlc3MgaG93IG1hbnkgUENzIGNhcHR1cmUgbW9zdCBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRhdGEgCkVsYm93UGxvdChjb25fc2V1X2Z0LCBuZGltcyA9IDMwKQoKYGBgCgpXZSB3b24ndCBydW4gdGhpcyBjb2RlCkkndmUgaW5jbHVkZWQgdGhpcyBhbmFseXNpcyB0aGF0IGNhbGN1bGF0ZXMgdGhlIGN1dC1vZmYgZm9yIHNpZ25pY2FuY2Ugb2YgY29tcG9uZW50IG51bWJlcnMuICBIb3dldmVyIHRoZSBmdW5jdGlvbiBydW5zIG11bHRpcGxlIGl0ZXJhdGlvbnMgb2YgdGhlIFBDQSBhbmQgd2lsbCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJ1bi4gCgpgYGB7cn0KIyBKYWNrc3RyYXcKCiNBc3Nlc3MgaG93IG1hbnkgUENzIGNhcHR1cmUgbW9zdCBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRhdGEgCnNldSA8LUphY2tTdHJhdyhzZXUsIHJlZHVjdGlvbiA9ICJwY2EiLAogIGRpbXMgPSAzMCkKc2V1IDwtIFNjb3JlSmFja1N0cmF3KHNldSwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpKYWNrU3RyYXdQbG90KHNldSwgZGltcyA9IDE6MzApCgpgYGAKCgpOb24tbGluZWFyIGRpbWVuc2lvbmFsIHJlZHVjdGlvbiB1c2luZyBVTUFQCmBgYHtyfQoKI05vbi1saW5lYXIgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uCiNDaG9vc2luZyBob3cgbWFueSBQQ3MgdG8gaW5wdXQgY2FuIGRlcGVuZCBvbiB0aGUgZWxib3cgcGxvdCBhbmQgb24gdGhlIG51bWJlciBvZiBjZWxscwojVGhlcmUgYXJlIG1hbnkgcGFyYW1ldGVycyB0aGF0IGNhbiBlIHR3ZWFrZWQgYW5kIG9wdGltaXplZCBpbiBhIFVNQVAgcGxvdAojWW91IGNhbiBzZWUgc29tZSBkZW1vcyBoZXJlOiBodHRwczovL3BhaXItY29kZS5naXRodWIuaW8vdW5kZXJzdGFuZGluZy11bWFwLwpjb25fc2V1X2Z0IDwtIFJ1blVNQVAoY29uX3NldV9mdCwgZGltcyA9IDE6MTgpClVNQVBQbG90KGNvbl9zZXVfZnQpCgoKYGBgCgoKRG91YmxldCBpZGVudGlmaWNhdGlvbgoKYGBge3J9CgojIEFzc2VzcyBwb3NzaWJsZSBkb3VibGV0cyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI1VzaW5nIGluc3RydWN0aW9ucyBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vY2hyaXMtbWNnaW5uaXMtdWNzZi8KCiNGaXJzdCB3ZSBoYXZlIHRvIGZpbmQgYSBwSyB3aGljaCBkZXRlcm1pbmVzIGhvdyBiaWcgb2YgYSBuZWlnaGJvcmhvb2Qgd2lsbCBiZSBleGFtaW5lZCBmb3IgZG91YmxldHMKI1RoaXMgc2hvdWxkIGJlIGNob3NlbiBmb3IgZWFjaCBsaWJyYXJ5IHNlcGFyYXRlbHkKI0ZpcnN0IHdlIHRlc3QgYSBudW1iZXIgb2YgcE4gKHByb3BvcnRpb24gb2YgZ2VuZXJhdGVkIGFydGlmaWNpYWwgZG91YmxldHMpIGFuZCBwSwojV2UgZ2V0IGRpZmZlcmVudCBsaXN0cyBvZiBwcm9iYWJpbGl0aWVzIG9mIGFydGlmaWNhbCBuZWFyZXN0IG5laWdoYm9ycyB3aXRoIHRoZXNlIHRlc3RlZCBwYXJhbWV0ZXJzCiNBbHNvIGtlZXAgaW4gbWluZCB0aGUgcmVzdWx0cyBhcmUgbm90IGRldGVybWluaXN0aWMgKGV2ZXJ5IHJ1biB3aWxsIGdpdmUgc2xpZ2h0bHkgZGlmZmVyZW50IHJlc3VsdHMpCnN3ZWVwLnJlcy5jb24gPC0gcGFyYW1Td2VlcF92Myhjb25fc2V1X2Z0LCBQQ3MgPSAxOjE4LCBzY3QgPSBGQUxTRSkKCiNXZSBkbyBub3QgaGF2ZSB0aGUgImdyb3VuZCB0cnV0aCIgcmVnYXJkaW5nIGRvdWJsZXRzLCBzdWNoIGZyb20gZnJvbSBnZW5vdHlwZSBkYXRhIGZvciBwb29sZWQgc2FtcGxlcyAKI1dlIHN1bWFtcml6ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIHJhbmdlIG9mIHBOPXBLIHBhcmFtZXRlcnMgd2UgdGVzdGVkCnN3ZWVwLnN0YXRzX2NvbiA8LSBzdW1tYXJpemVTd2VlcChzd2VlcC5yZXMuY29uLCBHVCA9IEZBTFNFKQoKI0hlcmUgdGhlICJiZXN0IiBwSyBmb3IgdGhlIGRhdGEgaXMgY2hvc2VuIGJhc2VkIG9uIGEgbWV0cmljIGRldGVybWluZWQgYnkgdGhlIERvdWJsZXRGaW5kZXIgZGV2ZWxvcGVycwojV2hpY2ggcGVyZm9ybXMgYmVzdCBpbiBkYXRhc2V0cyB3aGVyZSB0aGUgZ3JvdW5kIHRydXRoIGlzIGtub3duCmJjbXZuX2NvbiA8LSBmaW5kLnBLKHN3ZWVwLnN0YXRzX2NvbikKZ2dwbG90KGJjbXZuX2NvbiwgYWVzKHggPSBwSywgeSA9IEJDbWV0cmljLCBncm91cCA9ICJTd2VlcCIpKSArIGdlb21fcG9pbnQoKSArIGdlb21fbGluZSgpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCgpgYGB7cn0KCiNXZSB3aWxsIHBpY2sgcEsgPSAwLjA4CiNXZSBhcmUgbm90IGdvaW5nIHRvIHVzZSBvdXIgY2x1c3RlcmluZyBpbmZvcm1hdGlvbiB0byBlc3RpbWF0ZSAiaG9tb3R5cGljIiBkb3VibGV0cwojV2UgYXJlIHNpbXBseSBnb2luZyB0byB1c2UgYW4gZXhwZWN0ZWQgZG91YmxldCBmb3JtYXRpb24gcmF0ZSBvZiAyLjUlIGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc3RhcnRpbmcgY2VsbHMgbG9hZGVkCgpuRXhwX3BvaSA8LSByb3VuZCgwLjAyNSpucm93KGNvbl9zZXVfZnRAbWV0YS5kYXRhKSkKY29uX3NldV9mdCA8LSBkb3VibGV0RmluZGVyX3YzKGNvbl9zZXVfZnQsIFBDcyA9IDE6MTgsIHBOID0gMC4yNSwgcEsgPSAwLjA4LCBuRXhwID0gbkV4cF9wb2ksIHJldXNlLnBBTk4gPSBGQUxTRSwgc2N0ID0gRkFMU0UpCgojSGVyZSB3ZSB1cGRhdGUgdGhlIFNldXJhdCBvYmplY3QgdmVyc2lvbiBqdXN0IGluIGNhc2UgdGhlIG9uZSByZXR1cm5lZCBieSBEb3VibGV0RmluZGVyIGlzIGFuIG9sZGVyIHZlcnNpb24KY29uX3NldV9mdCA8LSBVcGRhdGVTZXVyYXRPYmplY3QoY29uX3NldV9mdCkKCiMgd2UgaGF2ZSBub3cgaWRlbnRpZmllZCBkb3VibGV0cyBidXQgd2UgaGF2ZSBub3QgcmVtb3ZlZCB0aGVtCgoKYGBgCgpWaXN1YWxpemUgdGhlIGRvdWJsZXQgcmVtb3ZhbCByZXN1bHRzCgpgYGB7cn0KCiMgd2UgbmVlZCB0byBsb29rIGluIHRoZSBkYXRhIG9iamVjdAoKI1Zpc3VhbGl6ZSBhbmQgYXNzZXNzIHRoZSBjZWxscyBjYWxsZWQgYXMgcHJvYmFibGUgZG91YmxldHMKVU1BUFBsb3QoY29uX3NldV9mdCwgZ3JvdXAuYnkgPSAiREYuY2xhc3NpZmljYXRpb25zXzAuMjVfMC4wOF83MyIpCgojIHRhYmxlIG9mIGRvdWJsZXRzIGFuZCBzaWdubGV0cwpjb25fc2V1X2Z0JERGLmNsYXNzaWZpY2F0aW9uc18wLjI1XzAuMDhfNzMgJT4lIHRhYmxlCgojIHZpc3VhbGl6ZSB0aGUgZmVhdHVyZXMgaW4gZG91YmxldHMgYW5kIHNpbmdsZXRzClZsblBsb3QoY29uX3NldV9mdCwgZmVhdHVyZXMgPSBjKCJuQ291bnRfUk5BIiwgIm5GZWF0dXJlX1JOQSIsICJwZXJjZW50Lk1UIiwgInBBTk5fMC4yNV8wLjA4XzczIiksIAogICAgICAgIGdyb3VwLmJ5ID0gIkRGLmNsYXNzaWZpY2F0aW9uc18wLjI1XzAuMDhfNzMiLCBwdC5zaXplID0gMC4wMDEsIG5jb2wgPSAyLCBsb2cgPSBUUlVFKQoKYGBgCgpgYGB7cn0KIyByZW1vdmUgdGhlIGRvdWJsZXRzCiMgd2UgY2FuIGRvIHRoaXMgYnkgc3Vic2V0CiMgZmlyc3Qgd2UgbmVlZCB0byBzZXQgdGhlIGFjdGl2ZSBtZXRhIGRhdGEgc2xvdCB0byB0aGUgZG91YmxldCBpZGVudGlmaWNhdGlvbgpJZGVudHMoY29uX3NldV9mdCkgPC0gIkRGLmNsYXNzaWZpY2F0aW9uc18wLjI1XzAuMDhfNzMiCiMgd2Ugc2VsZWN0IG9ubHkgdGhlIHNpbmdsZXQgY2VsbHMKY29uX3NldV9mdDIgPC0gc3Vic2V0KGNvbl9zZXVfZnQsIGlkZW50cyA9ICJTaW5nbGV0IikKZGltKGNvbl9zZXVfZnQpCmRpbShjb25fc2V1X2Z0MikKCmBgYAoKCgoKUmVwZWF0IHRoZSBhYm92ZSBzdGVwcyBmb3IgdGhlIFNOQ0EgdHJpcGxpY2F0aW9uIHBhdGllbnQgbGluZQoKYGBge3J9CiMgcmVhZCBpbiBkYXRhCgphc3RfZGF0YSA8LSBSZWFkMTBYKCIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9BU1QyM19CcmFpbkNvbW0vQ2VsbFJhbmdlck91dHMvQVNUMjMvcmF3X2ZlYXR1cmVfYmNfbWF0cml4IikKCgojIGNyZWF0ZSBzZXVyYXQgb2JqZWN0CgoKIyBmaWx0ZXIgb2JqZWN0IHdpdGggdGhlIHNhbWUgc2V0dGluZ3MgYXMgd2l0aCB0aGUgY29udHJvbAoKCiMgUENBIGFuYWx5c2lzCgojIFJlbW92ZSBkb3VibGV0cwoKCgpgYGAKCgpgYGB7cn0KIyBjbGVhbiB1cCAKcm0oYXN0X2RhdGEsYXN0X3NldV9mdCxiY212bl9hc3QsYmNtdm5fY29uLGNvbl9zZXVfZnQsIHN3ZWVwLnJlcy5hc3QsIHN3ZWVwLnJlcy5jb24sIHN3ZWVwLnN0YXRzX2FzdCwgc3dlZXAuc3RhdHNfY29uKQpgYGAKCgojIEJSRUFLCgpNZXJnZSBkYXRhIG9iamVjdHMKCmBgYHtyfQoKbWVyZ2Vfc2V1cmF0IDwtIG1lcmdlKGNvbl9zZXVfZnQyLGFzdF9zZXVfZnQyKQptZXJnZV9zZXVyYXQKCnVuaXF1ZShtZXJnZV9zZXVyYXQkb3JpZy5pZGVudCkKCgpgYGAKCkZpbmQgYW5jaG9ycyBiZXR3ZWVuIHRoZSB0d28gZGF0YSBvYmplY3RzCmBgYHtyfQpzYW1wbGUubGlzdCA8LSBTcGxpdE9iamVjdChtZXJnZV9zZXVyYXQsIHNwbGl0LmJ5ID0gIm9yaWcuaWRlbnQiKQoKIyBXZSBoYXZlIGFscmVhZHkgbm9ybWFsaXplZCBhbmQgaWRlbnRpZmllZCB2YXJpYWJsZSBmZWF0dXJlcyBpbiBlYWNoIHNhbXBsZQojIElmIHdlIGhhZCBub3QgZG9uZSBzbyB3ZSBjYW4gbm9ybWFsaXplIGhlcmUKI2ZvciAoaSBpbiAxOmxlbmd0aChzYW1wbGUubGlzdCkpewogIyBvcmcubGlzdFtbaV1dIDwtIE5vcm1hbGl6ZURhdGEob3JnLmxpc3RbW2ldXSwgdmVyYm9zZSA9IEZBTFNFKQogICNvcmcubGlzdFtbaV1dIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKG9yZy5saXN0W1tpXV0sIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IikKI30KCiMgTm93IHdlIGZpbmQgZmVhdHVyZXMgdGhhdCBjYW4gYWN0IGFzIGFuY2hvcnMgYmV0d2VlbiB0aGUgdHdvIHNhbXBsZXMKaW50LmFuY2hvcnMgPC0gRmluZEludGVncmF0aW9uQW5jaG9ycyhvYmplY3QubGlzdCA9IHNhbXBsZS5saXN0LCBkaW1zID0gMTo1MCkKaW50ZWdyYXRlZF9zZXVyYXQgPC0gSW50ZWdyYXRlRGF0YShhbmNob3JzZXQgPSBpbnQuYW5jaG9ycywgZGltcyA9IDE6NTApCgpgYGAKCgpPcHRpb25hbDogc2F2ZSB0aGUgaW50ZWdyYXRlZCBvYmplY3Qgb3IgcmVhZCBpbiB0aGUgSW50ZWdyYXRlZCBvYmplY3QgZm9yIHRoZSBuZXh0IHN0ZXAuCgpgYGB7cn0KIyByZW1vdmUgIyBjb21tZW50IGZyb20gdGhlIGNvZGUgeW91IHdhbnQgdG8gcnVuCgpzYXZlUkRTKGludGVncmF0ZWRfc2V1cmF0LCJJbnRlZ3JhdGVkU2V1cmF0LlJEUyIpCiNpbnRlZ3JhdGVkX3NldXJhdGUgPC0gcmVhZFJEUygiSW50ZWdyYXRlZFNldXJhdC5SRFMiKQoKYGBgCgpQQ0EgYW5kIFVNQVAgb24gdGhlIG1lcmdlZCBvYmplY3QKCmBgYHtyfQojIG1lcmdlZCBvYmplY3QKCkRlZmF1bHRBc3NheShtZXJnZV9zZXVyYXQpIDwtICJSTkEiCgptZXJnZV9zZXVyYXQgPC0gU2NhbGVEYXRhKG1lcmdlX3NldXJhdCwgdmVyYm9zZSA9IEZBTFNFKQojIGluIHRoZSBtZXJnZSBkYXRhIHNldCB3ZSBzaWxsIG5lZWQgZmVhdHVyZXMgZm9yIHRoZSBQQ0EgaW5wdXQKbWVyZ2Vfc2V1cmF0IDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKG1lcmdlX3NldXJhdCwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiKQptZXJnZV9zZXVyYXQgPC0gUnVuUENBKG1lcmdlX3NldXJhdCwgbnBjcyA9IDMwLCB2ZXJib3NlID0gRkFMU0UpCm1lcmdlX3NldXJhdCA8LSBSdW5VTUFQKG1lcmdlX3NldXJhdCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQoKCmBgYAoKCgpSZXBlYXQgUENBIGFuZCBVTUFQIGZvciB0aGUgaW50ZWdyYXRlZCBvYmplY3QKCmBgYHtyfQpEZWZhdWx0QXNzYXkoaW50ZWdyYXRlZF9zZXVyYXQpIDwtICJpbnRlZ3JhdGVkIgppbnRlZ3JhdGVkX3NldXJhdCA8LSBTY2FsZURhdGEoaW50ZWdyYXRlZF9zZXVyYXQsIHZlcmJvc2UgPSBGQUxTRSkKIyBvbmx5IHRoZSBpbnRlZ3JhdGVkIGZlYXR1cmVzIHdpbGwgYmUgdGhlIHBjYSBpbnB1dAoKaW50ZWdyYXRlZF9zZXVyYXQgPC0gUnVuUENBKGludGVncmF0ZWRfc2V1cmF0LCBucGNzID0gMzAsIHZlcmJvc2UgPSBGQUxTRSkKaW50ZWdyYXRlZF9zZXVyYXQgPC0gUnVuVU1BUChpbnRlZ3JhdGVkX3NldXJhdCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQoKYGBgCgoKT3B0aW9uYWw6IHNhdmUgdGhlIFBDQSBhbmQgVU1BUCBpbnRlZ3JhdGVkIG9iamVjdCBvciByZWFkIGluIHRoZSBzYXZlZCBvYmplY3QKYGBge3J9CiMgcmVtb3ZlICMgY29tbWVudCBmcm9tIHRoZSBjb2RlIHlvdSB3YW50IHRvIHJ1bgpzYXZlUkRTKGludGVncmF0ZWRfc2V1cmF0LCJJbnRlZ3JhdGVkU2V1cmF0R3JhcGhzLlJEUyIpCiNpbnRlZ3JhdGVkX3NldXJhdCA8LSByZWFkUkRTKCJJbnRlZ3JhdGVkU2V1cmF0R3JhcGhzLlJEUyIpCgpgYGAKCkxldCdzIGxvb2sgYXQgdGhlIFVNQVBzIGZyb20gdGhlIG1lcmdlZCB2cyB0aGUgaW50ZWdyYXRlZCBkYXRhCmBgYHtyfQoKcDEgPC0gRGltUGxvdChtZXJnZV9zZXVyYXQsIGdyb3VwLmJ5ID0gIm9yaWcuaWRlbnQiKSArIGdndGl0bGUoIk1lcmdlIikKcDIgPC0gRGltUGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIpICsgZ2d0aXRsZSgiSW50ZWdyYXRlZCIpCgpwMQpwMgoKYGBgCldlIHNlZSBhbG1vc3Qgbm8gZGlmZmVyZW5jZSBpbiB0aGlzIGRhdGEuIFRoaXMgaXMgbm90IHRoZSBjYXNlIGluIGFsbCBkYXRhIHNldHMKCkNsdXN0ZXIgdGhlIGludGVncmF0ZWQgZGF0YQoKYGBge3J9CiMgc2VlIHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBwY2EgY29tcG9uZW50cwpFbGJvd1Bsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIG5kaW1zPTMwKQppbnRlZ3JhdGVkX3NldXJhdAoKYGBgCgpgYGB7cn0KZGltKGludGVncmF0ZWRfc2V1cmF0KQoKYGBgCgpXZSB3aWxsIGNob29zZSAyMCBQQ3MKVGhlcmUgYXJlIDQwMjggY2VsbHMuICBBIGNvbW1vbiBydWxlIG9mIHRodW1iIGZvciBjaG9vc2luZyBrIGZvciBuZWFyZXN0IG5laWdoYm91cnMgaXMgdXNpbmcgdGhlIHNxdWFyZSByb290IG9mIHRoZSBudW1iZXIgb2YgY2VsbHMgPSA2MwoKYGBge3J9CiMgY2FsY3VsYXRlIHRoZSBzcXVhcmUgcm9vdApzcXJ0KDQwMjgpCgojIHRoZSBLIHBhcmFtZXRlciBjaGFuZ2VzIHRoZSBzaXplIG9mIGNsdXN0ZXJzIGJ5IGNoYW5naW5nIHRoZSBzdGFydGluZyBub2RlcyBpbnB1dCBpbnRvIHRoZSBMb3V2YWluIG5ldHdvcmsKCmludGVncmF0ZWRfc2V1cmF0IDwtIEZpbmROZWlnaGJvcnMoaW50ZWdyYXRlZF9zZXVyYXQsIGRpbXMgPSAxOjIwLCBrLnBhcmFtID0gNjMpCiMgdGhlIG51bWJlciBvZiBjbHVzdGVycyBpcyBkZXBlbmRlbnQgb24gdGhlIHJlc29sdXRpb24gYSBudW1iZXIgZnJvbSAwLTIuIAojIEhpZ2hlciB2YWx1ZXMgbWFrZSBtb3JlIGNsdXN0ZXJzCiMgd2UgaW5jbHVkZSAKaW50ZWdyYXRlZF9zZXVyYXQgPC0gRmluZENsdXN0ZXJzKGludGVncmF0ZWRfc2V1cmF0LCByZXNvbHV0aW9uID0gYygwLDAuMDUsMC4yNSwwLjQsMC41LDAuNiwxLDEuNSkgKQoKIyB3ZSBjYW4gdmlzdWFsaXplIHdoaWNoIGNlbGxzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGF0IGRpZmZlcmVudCByZXNvbHV0aW9ucyB1c2luZyBjbHVzdHJlZQoKY2x1c3RyZWUoaW50ZWdyYXRlZF9zZXVyYXQsIHByZWZpeCA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuIikKCmBgYAoKClZpc3VhbGl6ZSB0aGUgVU1BUCBvZiB0aGUgZGlmZmVyZW50IGNsdXN0ZXIgcmVzb2x1dGlvbnMKYGBge3J9CnJlcyA8LSBjKDAuMDUsMC4yNSwwLjQsMC41LDAuNiwxLDEuNSkKcmVzb2x1dGlvbnMgPC0gcGFzdGUoImludGVncmF0ZWRfc25uX3Jlcy4iLCByZXMsIHNlcD0iIikKcmVzb2x1dGlvbnMKCmZvcihyIGluIHJlc29sdXRpb25zKXsKICBwcmludChEaW1QbG90KGludGVncmF0ZWRfc2V1cmF0LCBncm91cC5ieSA9IHIpKQp9CgoKYGBgCgojIEJSRUFLCgoKTm93IHdlIG5lZWQgdG8gY2hvb3NlIGEgcmVzb2x1dGlvbiB0byBhbm5vdGF0ZS4KSSB3aWxsIHNlbGVjdCByZXNvbHV0aW9uIG9mIDAuNi4KCmBgYHtyfQojIFNjYWxlIHRoZSB0b3RhbCBSTkEKIyBiZWZvcmUgd2Ugb25seSBzY2FsZWQgdGhlIGludGVncmF0ZWQgZXhwcmVzc2lvbiBmb3IgdGhlIGdlbmVzIHVzZWQgZm9yIGludGVncmF0aW9uCiMgbm93IHdlIHdhbnQgdG8gc2NhbGUgYWxsIGdlbmVzCgpEZWZhdWx0QXNzYXkoaW50ZWdyYXRlZF9zZXVyYXQpIDwtICJSTkEiCmludGVncmF0ZWRfc2V1cmF0IDwtIFNjYWxlRGF0YShpbnRlZ3JhdGVkX3NldXJhdCkKCgpgYGAKCgoKTG9vayBhdCBrbm93biBjZWxsIHR5cGUgbWFya2VycwoKYGBge3J9CiMgZmVhdHVyZXMgbGlzdCBmcm9tIGxpdGVyYXR1cmUKCmRhX25ldXJvbnMgPC0gYygiVEgiLCJTTEM2QTMiLCJTTEMxOEEyIiwiU09YNiIsIk5ETkYiLCJTTkNHIiwiQUxESDFBMSIsIkNBTEIxIiwiVEFDUjIiLCJTTEMxN0E2IiwiU0xDMzJBMSIsIk9UWDIiLCJHUlAiLCJMUEwiLCJDQ0siLCJWSVAiKQpOUENfb3JTdGVtTGlrZSA8LSBjKCJEQ1giLCJORVVST0QxIiwiVEJSMSIsIlBDTkEiLCJNS0k2NyIsIlNPWDIiLCJORVMiLCJQQVg2IiwiTUFTSDEiKQptYXR1cmVfbmV1cm9ucyA9IGMoIlJCRk9YMyIsIlNZUCIsIkRMRzQ1IiwiVkFNUDEiLCJWQU1QMiIsIlRVQkIzIiwiU1lUMSIsIkJTTiIsIkhPTUVSMSIsIlNMQzE3QTYiKQpleGNpdGF0b3J5X25ldXJvbnMgPSBjKCJHUklBMiIsIkdSSUExIiwiR1JJQTQiLCJHUklOMSIsIkdSSU4yQiIsIkdSSU4yQSIsIkdSSU4zQSIsIkdSSU4zIiwiR1JJUDEiLCJDQU1LMkEiKQppbmhiaXRvcnlfbmV1cm9ucyA9IGluaCA9IGMoIkdBRDEiLCJHQUQyIiwgIkdBVDEiLCJQVkFMQiIsIkdBQlIyIiwiR0FCUjEiLCJHQlJSMSIsIkdBQlJCMiIsIkdBQlJCMSIsIkdBQlJCMyIsIkdBQlJBNiIsIkdBQlJBMSIsIkdBQlJBNCIsIlRSQUsyIikKYXN0cm9jeXRlcyA8LSBjKCJHRkFQIiwiUzEwMEIiLCJBUVA0IiwiQVBPRSIsICJTT1g5IiwiU0xDMUEzIikKb2xpZ29kZW5kcm9jeXRlcyA8LSBjKCJNQlAiLCJNT0ciLCJPTElHMSIsIk9MSUcyIiwiU09YMTAiKQpvcGMgPC0gCnJhZGlhbF9nbGlhIDwtIGMoIlBUUFJDIiwiQUlGMSIsIkFER1JFMSIsICJWSU0iLCAiVE5DIiwiUFRQUloxIiwiRkFNMTA3QSIsIkhPUFgiLCJMSUZSIiwKICAgICAgICAgICAgICAiSVRHQjUiLCJJTDZTVCIsIlNMQzFBMyIpCmVwaXRoZWxpYWwgPC0gYygiSEVTMSIsIkhFUzUiLCJTT1gyIiwiU09YMTAiLCJORVMiLCJDREgxIiwiTk9UQ0gxIikKCm1pY3JvZ2xpYSA8LSBjKCJJQkExIiwiUDJSWTEyIiwiUDJSWTEzIiwiVFJFTTExOSIsICJHUFIzNCIsIlNJR0xFQ0giLCJUUkVNMiIsCiAgICAgICAgICAgICAgICJDWDNDUjEiLCJGQ1JMUyIsIk9MRk1MMyIsIkhFWEIiLCJUR0ZCUjEiLCAiU0FMTDEiLCJNRVJUSyIsCiAgICAgICAgICAgICAgICJQUk9TMSIpCgpmZWF0dXJlc19saXN0IDwtIGMoIk1LSTY3IiwiU09YMiIsIlBPVTVGMSIsIkRMWDIiLCJQQVg2IiwiU09YOSIsIkhFUzEiLCJORVMiLCJSQkZPWDMiLCJNQVAyIiwiTkNBTTEiLCJDRDI0IiwiR1JJQTIiLCJHUklOMkIiLCJHQUJCUjEiLCJHQUQxIiwiR0FEMiIsIkdBQlJBMSIsIkdBQlJCMiIsIlRIIiwiQUxESDFBMSIsIkxNWDFCIiwiTlI0QTIiLCJDT1JJTiIsIkNBTEIxIiwiS0NOSjYiLCJDWENSNCIsIklUR0E2IiwiU0xDMUEzIiwiQ0Q0NCIsIkFRUDQiLCJTMTAwQiIsICJQREdGUkEiLCJPTElHMiIsIk1CUCIsIkNMRE4xMSIsIlZJTSIsIlZDQU0xIikKCnNob3J0X2xpc3QgPC0gYygiTUtJNjciLCJTT1g5IiwiSEVTMSIsIk5FUyIsIkRMWDIiLCJSQkZPWDMiLCJNQVAyIiwiVEgiLCJDQUxCMSIsIktDTko2IiwiU0xDMUEzIiwiQ0Q0NCIsIkFRUDQiLCJTMTAwQiIsIk9MSUcyIiwiTUJQIiwiVklNIikKCgoKYGBgCgpTZXVyYXQgaGFzIHNldmVyYWwgaGVscGZ1bCBwbG90dGluZyBmdW5jdGlvbiB0aGF0IHVzZSBnZ3Bsb3QKCmBgYHtyfQojIHdlIHNldCB0aGUgYWN0aXZlIGlkZW50aXR5IG9mIHRoZSBtZXRhIGRhdGEgdG8gYmUgdGhlIGNsdXN0ZXJzIGF0IHRoZSByZXNvbHV0aW9uIHdlIHdhbnQgdG8gbGFiZWwKSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KSA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjAuNiIKCkZlYXR1cmVQbG90KGludGVncmF0ZWRfc2V1cmF0LCBsYWJlbCA9IFRSVUUsIGZlYXR1cmVzID0gc2hvcnRfbGlzdCkKCgoKYGBgCgoKCmBgYHtyfQojIHRoaXMgd2lsbCBsZXQgdXMgc2VlIG9uZSBhdCBhdCB0aW1lCmZvciAoaSBpbiBzaG9ydF9saXN0KSB7CiAgcHJpbnQoRmVhdHVyZVBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGZlYXR1cmVzID0gaSwgbWluLmN1dG9mZiA9ICdxMScsIG1heC5jdXRvZmYgPSAncTk3JywgbGFiZWwgPSBUUlVFKSkKfQoKCmBgYApOb3cgdGhhdCB3ZSBzZWUgdGhlIFRIIGlzIGFsbCBpbiBvbmUgc3BvdCB0aGF0IGlzIHBhcnQgb2YgYSBsYXJnZSBjbHVzdGVyIHdlIGxvb2sgYmFjayBhdCB0aGUgZGlmZmVyZW50IGNsdXN0ZXIgbGV2ZWwuCgpgYGB7cn0KCiMgc2VlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc2FtcGxlcwpGZWF0dXJlUGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZmVhdHVyZXMgPSAiVklNIiwgbWluLmN1dG9mZiA9ICdxMScsIG1heC5jdXRvZmYgPSAncTk3JywgbGFiZWwgPSBUUlVFLCBzcGxpdC5ieSA9ICJvcmlnLmlkZW50IikKCgojIGxvb2sgYXQgdGhlIEZlYXR1cmUgcGxvdHMgd2l0aCB0aGUgY2x1c3RlciByZXNvbHV0aW9uIDEKSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KSA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiCkZlYXR1cmVQbG90KGludGVncmF0ZWRfc2V1cmF0LCBsYWJlbCA9IFRSVUUsIGZlYXR1cmVzID0gYygiVklNIiwiQVFQNCIpKQoKYGBgCgoKRG90IFBsb3RzCgpgYGB7cn0KCkRvdFBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGdyb3VwLmJ5ID0gImludGVncmF0ZWRfc25uX3Jlcy4xIiwgCiAgICAgICAgZmVhdHVyZXMgPSBzaG9ydF9saXN0LCBhc3NheSA9ICJSTkEiKSArIFJvdGF0ZWRBeGlzKCkKCgoKRG90UGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiLCAKICAgICAgICBmZWF0dXJlcyA9IGRhX25ldXJvbnMsIGFzc2F5ID0gIlJOQSIpICsgUm90YXRlZEF4aXMoKQoKRG90UGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiLCAKICAgICAgICBmZWF0dXJlcyA9IG1hdHVyZV9uZXVyb25zLCBhc3NheSA9ICJSTkEiKSArIFJvdGF0ZWRBeGlzKCkKCgpgYGAKCkhlYXRtYXBzCgpgYGB7cn0KCgpEb0hlYXRtYXAoaW50ZWdyYXRlZF9zZXVyYXQsIGdyb3VwLmJ5ID0gImludGVncmF0ZWRfc25uX3Jlcy4xIiwgCiAgICAgICAgZmVhdHVyZXMgPSBzaG9ydF9saXN0LCBzbG90ID0gInNjYWxlLmRhdGEiKQoKCmBgYAoKTG9vayBhdCBtb3JlIGV4cHJlc3Npb24gbGlzdHMKCmBgYHtyfQoKCmBgYAoKCkZpbmQgQ2x1c3RlciBtYXJrZXJzCgpgYGB7cn0KIyBjbHVzdGVyIG1hcmtlcnMgd2lsbCBiZSBjYWxjdWxhdGVkIGZvciB0aGUgYWN0aXZlIGlkZW50aXR5CgpJZGVudHMoaW50ZWdyYXRlZF9zZXVyYXQpIDwtICJpbnRlZ3JhdGVkX3Nubl9yZXMuMSIKQ2x1c3Rlck1hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoaW50ZWdyYXRlZF9zZXVyYXQsIG9ubHkucG9zID0gVFJVRSkKCiMgb3B0aW9uYWw6IHNhdmUgdGhlIGNsdXN0ZXIgbWFya2Vycwojd3JpdGUuY3N2KENsdXN0ZXJNYXJrZXJzLCJDbHVzdGVyTWFya2Vycy5jc3YiKQoKCgpgYGAKClNlZSB0aGUgdG9wIGNsdXN0ZXIgbWFya2VycwoKYGBge3J9CmhlYWQoQ2x1c3Rlck1hcmtlcnMpCnRvcDUgPC0gQ2x1c3Rlck1hcmtlcnMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbihuPTUsIHd0ID1hdmdfbG9nMkZDKQoKdG9wMiA8LSBDbHVzdGVyTWFya2VycyAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKG49Miwgd3QgPWF2Z19sb2cyRkMpCkRvSGVhdG1hcChpbnRlZ3JhdGVkX3NldXJhdCwgZmVhdHVyZXMgPSB0b3A1JGdlbmUsIHNpemUgPSAzLCBhbmdsZSA9IDkwLCBncm91cC5ieSA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuMSIpCgpEb0hlYXRtYXAoaW50ZWdyYXRlZF9zZXVyYXQsIGZlYXR1cmVzID0gdG9wMiRnZW5lLCBzaXplID0gMywgYW5nbGUgPSA5MCwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiKQoKYGBgCgpOb3cgd2UgY2FuIGxvb2sgYXQgdGhlIGNsdXN0ZXIgbWFya2VycyBmb3IgY2x1c3RlciB1c2luZyBFbnJpY2hSIHRvIGNvbXBhcmUgdG8gcmVmZXJlbmNlIGxpYnJhcmllcwoKYGBge3J9CgoKc2V0RW5yaWNoclNpdGUoIkVucmljaHIiKSAjIEh1bWFuIGdlbmVzCiMgbGlzdCBvZiBhbGwgdGhlIGRhdGFiYXNlcwoKZGJzIDwtIGxpc3RFbnJpY2hyRGJzKCkKCiMgdGhpcyB3aWxsIGxpc3QgdGhlIHBvc3NpYmxlIGxpYnJhcmllcwpkYnMKCiMgc2VsZWN0IGxpYnJhcmllcyB3aXRoIGNlbGwgdHlwZXMKZGIgPC0gYygnQ2VsbE1hcmtlcl9BdWdtZW50ZWRfMjAyMScsJ0F6aW11dGhfQ2VsbF9UeXBlc18yMDIxJykKCgpgYGAKCgoKSGVyZSBpcyBhIHNtYWxsIGZ1bmN0aW9uIHRvIHJ1biBlYXNpbHkgb24gZWFjaCBjbHVzdGVyIGFuZCBmaW5kIHRoZSBjZWxsIHR5cGUgbGlicmFyeSBwcmVkaWN0aW9ucyAoc3BlY2lmaWMgdG8gdGhlIGxpYnJhcmllcyBJIHNlbGVjdGVkKQoKYGBge3J9CgpjaGVja0NlbGx0eXBlcyA8LSBmdW5jdGlvbihjbHVzdGVyX251bSA9IDApewogIGNsdXN0ZXJYIDwtIENsdXN0ZXJNYXJrZXJzICU+JSBmaWx0ZXIoY2x1c3RlciA9PSBjbHVzdGVyX251bSAmIGF2Z19sb2cyRkMgPiAwLjI1KQogIGdlbmVzIDwtIGNsdXN0ZXJYJGdlbmUKICAjIHRoZSBjZWxsIHR5cGUgbGlicmFyaWVzCiAgIyBnZXQgdGhlIHJlc3VsdHMgZm9yIGVhY2ggbGlicmFyeQogIGNsdXN0ZXJYLmNlbGwgPC0gZW5yaWNocihnZW5lcywgZGF0YWJhc2VzID0gZGIpCiAgIyB2aXN1YWxpemUgdGhlIHJlc3VsdHMKcHJpbnQocGxvdEVucmljaChjbHVzdGVyWC5jZWxsW1sxXV0sIHNob3dUZXJtcyA9IDIwLCBudW1DaGFyID0gNDAsIHkgPSAiQ291bnQiLCBvcmRlckJ5ID0gIlAudmFsdWUiLCB0aXRsZSA9ICdDZWxsTWFya2VyX0F1Z21lbnRlZF8yMDIxJykpCnByaW50KHBsb3RFbnJpY2goY2x1c3RlclguY2VsbFtbMl1dLCBzaG93VGVybXMgPSAyMCwgbnVtQ2hhciA9IDQwLCB5ID0gIkNvdW50Iiwgb3JkZXJCeSA9ICJQLnZhbHVlIiwgdGl0bGUgPSAnQXppbXV0aF9DZWxsX1R5cGVzXzIwMjEnKSkKCn0KCgpgYGAKClJ1biB0aGUgZnVuY3Rpb24gZm9yIGVhY2ggY2x1c3RlciB0byBzZWUgaWYgd2UgY2FuIGlkZW50aWZ5IGNlbGwgdHlwZXMKCmBgYHtyfQoKY2x1c3RlcjAgPC0gY2hlY2tDZWxsdHlwZXMoY2x1c3Rlcl9udW0gPSAwKQoKYGBgCkNsdXN0ZXIgMCBpcyBsaWtlbHkgaW1tYXR1cmUgbmV1cm9ucyAtIHBvc3NpYmx5IGJvdGggR2x1dGFtYXRlcmdpYyBhbmQgZ2FiYWVyZ2ljCgpgYGB7cn0KY2x1c3RlcjEgPC0gY2hlY2tDZWxsdHlwZXMoY2x1c3Rlcl9udW0gPSAxKQoKYXMuZGF0YS5mcmFtZShjbHVzdGVyMSRkYXRhKQpjbHVzdGVyMVtbImRhdGEiXV0KCgpgYGAKQ2x1c3RlciAxIGlzIGFzdHJvY3l0ZXMKCmBgYHtyfQoKY2hlY2tDZWxsdHlwZXMoY2x1c3Rlcl9udW0gPSAxMSkKCmBgYAoKQWZ0ZXIgd2UgaGF2ZSBsb29rZWQgYXQgYWxsIHRoZSBjbHVzdGVycyB3ZSBhZGQgbWFudWFsIGFubm90YXRpb25zCgoKYGBge3J9CgojIHdlIG5lZWQgdG8gc2V0IHRoZSBpZGVudGl0eSB0byByZW5hbWUKSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KSA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiCgojIHdlIG5lZWQgdG8gbWFrZSBhIHZlY3RvciBvZiB0aGUgY2VsbCB0eXBlIGluIHRoZSBzYW1lIG9yZGVyIC0gaW4gdGhlIGNsdXN0ZXIgb3JkZXIKCmNlbGxfdHlwZXMxIDwtIGMoIm5ldXJvbnNfaW1tYXR1cmUiLCAiYXN0cm9jeXRlc18xIiwiZ2xpYSIsCiAgICAgICAgICAgICAgICAgIm5ldXJvbnNfbWF0dXJlIiwiT1BDIiwiZW5kb3RoZWxpYWxfMSIsCiAgICAgICAgICAgICAgICAgImVuZG90aGVsaWFsXzIiLCJhc3Ryb2N5dGVfMiIsIlJhZGlhbEdsaWEiLAogICAgICAgICAgICAgICAgICJuZXVyb25zMSIsIm5ldXJvbnNfR0FCQSIsIm5ldXJvbnMyIiwibmV1cmFsX3N0ZW0iLCJEQW5ldXJvbnMiKQogIApuYW1lcyhjZWxsX3R5cGVzMSkgPC0gbGV2ZWxzKGludGVncmF0ZWRfc2V1cmF0KQppbnRlZ3JhdGVkX3NldXJhdCA8LSBSZW5hbWVJZGVudHMoaW50ZWdyYXRlZF9zZXVyYXQsIGNlbGxfdHlwZXMxKQppbnRlZ3JhdGVkX3NldXJhdCA8LSBBZGRNZXRhRGF0YShvYmplY3Q9aW50ZWdyYXRlZF9zZXVyYXQsIG1ldGFkYXRhPUlkZW50cyhpbnRlZ3JhdGVkX3NldXJhdCksIGNvbC5uYW1lID0gIkNlbGxUeXBlcyIpCgoKYGBgCgoKTGV0cyBsb29rIGF0IHRoZSBhbm5vdGF0aW9ucyBvbiB0aGUgVU1BUAoKYGBge3J9CgpEaW1QbG90KGludGVncmF0ZWRfc2V1cmF0LCBncm91cC5ieSA9ICJDZWxsVHlwZXMiLCBsYWJlbCA9IFRSVUUpCgpgYGAKCgojIEJSRUFLCgoKQXV0b21hdGVkIGFubm90YXRpb24gCldlIHJlcXVpcmUgcmVmZXJlbmNlIGRhdGEgb2JqZWN0cyBmb3IgYm90aCBtZXRob2RzIHdlIHdpbGwgdXNlCgpgYGB7cn0KCiMgZGV2ZWxvcGluZyBmb3JlYnJhaW4KZGV2Zm9yZWJyYWluIDwtIHJlYWRSRFMoIi9Vc2Vycy9yaGFsZW5hdGhvbWFzL0RvY3VtZW50cy9EYXRhL3NjUk5Bc2VxL1B1YmxpY0RhdGEvS2Fyb2xpbnNraV9EZXZGb3JlYnJhaW5fZG93bnNhbXBsZV9MZXZlbDEuUkRTIikKCiMgZGV2ZWxvcGluZyBjb3J0ZXgKCmRldmNvdGV4IDwtIHJlYWRSRFMoIi9Vc2Vycy9yaGFsZW5hdGhvbWFzL0RvY3VtZW50cy9EYXRhL3NjUk5Bc2VxL1B1YmxpY0RhdGEvTm93YWtvd3NraV9kZXZfY29ydGV4dC5SRFMiKQoKIyBhZHVsdCBtaWRicmFpbgoKbWlkYnJhaW4gPC0gcmVhZFJEUygiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvc2NSTkFzZXEvUHVibGljRGF0YS9LYW1hdGhUb3RhbF9kb3duc2FtcGxlLlJEUyIpCgojY2hlY2sgdGhlIG1ldGEgZGF0YQpwcmludCgiRGV2ZWxvcGluZyBGb3JlYnJhaW4iKQpjb2xuYW1lcyhkZXZmb3JlYnJhaW5AbWV0YS5kYXRhKQpwcmludCgiRGV2ZWxvcGluZyBjb3J0ZXgiKQpjb2xuYW1lcyhkZXZjb3RleEBtZXRhLmRhdGEpCnByaW50KCJBZHVsdCBtaWRicmFpbiIpCmNvbG5hbWVzKG1pZGJyYWluQG1ldGEuZGF0YSkKCiMgd2UgbmVlZCB0byBrbm93IHRoZSBtZXRhZGF0YSBzbG90IG5hbWUgdG8gdXNlCgoKYGBgCgpTZXVyYXQgbGFiZWwgdHJhbnNmZXIgdXNpbmcgZmluZCBhbmNob3JzIC0gcHJlZGljdHMgY2VsbCB0eXBlcyBmcm9tIGEgcmVmZXJlbmNlIFNldXJhdCBvYmplY3QKCmBgYHtyfQoKIyBzZXQgdGhlIGFjdGl2ZSBtZXRhIGRhdGEgdG8gYmUgdGhlIGNlbGwgdHlwZSBsYWJlbHMgd2Ugd2FudAoKSWRlbnRzKGRldmZvcmVicmFpbikgPC0gIkNlbGx0eXBlcyIKIyBzZXQgdGhlIGRlZmF1bHQgYXNzYXkgdG8gYmUgUk5BIGJlY2F1c2UgdGhvc2UgYXJlIHRoZSBleHByZXNzaW9uIHZhbHVlcyB3ZSB3YW50CkRlZmF1bHRBc3NheShkZXZmb3JlYnJhaW4pIDwtICJSTkEiCkRlZmF1bHRBc3NheShpbnRlZ3JhdGVkX3NldXJhdCkgPC0gIlJOQSIKCgojIGZpbmQgdGhlIHJlZmVyZW5jZSBhbmNob3JzCmFuY2hvcnMgPC0gRmluZFRyYW5zZmVyQW5jaG9ycyhyZWZlcmVuY2UgPSBkZXZmb3JlYnJhaW4gLHF1ZXJ5ID0gaW50ZWdyYXRlZF9zZXVyYXQsIGRpbXMgPSAxOjI1KQoKIyBub3cgd2UgbWFrZSBwcmVkaWN0aW9ucyB3aXRoIHRoZSBhbmNob3JzCnByZWRpY3Rpb25zIDwtIFRyYW5zZmVyRGF0YShhbmNob3JzZXQgPSBhbmNob3JzLCByZWZkYXRhID0gZGV2Zm9yZWJyYWluJENlbGx0eXBlcykKCiMgbG9vayBhdCB0aGUgcHJlZGljdGlvbnMgb3V0cHV0CmhlYWQocHJlZGljdGlvbnMpCgojIGFkZCB0aGUgcHJlZGljdGlvbnMgdG8gdGhlIG1ldGEgZGF0YQppbnRlZ3JhdGVkX3NldXJhdCA8LSBBZGRNZXRhRGF0YShpbnRlZ3JhdGVkX3NldXJhdCwgbWV0YWRhdGEgPSBwcmVkaWN0aW9ucyRwcmVkaWN0ZWQuaWQsIGNvbC5uYW1lID0gInByZWRpY3RlZF9JRCIpCgojIHdlIGNhbiBhbHNvIGNvbnNpZGVyIHRoZSBwcm9iYWJpbGl0eSBvZiBlYWNoIHByZWRpY3Rpb24KaW50ZWdyYXRlZF9zZXVyYXQkcHJlZGljdGVkX3RocmVzaG9sZCA8LSBpZmVsc2UocHJlZGljdGlvbnMkcHJlZGljdGlvbi5zY29yZS5tYXggPiAwLjc1LCBpbnRlZ3JhdGVkX3NldXJhdCRwcmVkaWN0ZWRfSUQsICJOb25lIikKCiAKIyMgY2hlY2sgdGhlIHByb3BvcnRpb24gb2YgY2VsbCB0eXBlcyBwcmVkaWN0ZWQgaW4gZWFjaCBjbHVzdGVyCgp0LmxhYmxlcyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGludGVncmF0ZWRfc2V1cmF0JGludGVncmF0ZWRfc25uX3Jlcy4xLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGVkX3NldXJhdCRwcmVkaWN0ZWRfSUQpKQp0LmxhYmxlcyRGcmVxIDwtIGFzLmRvdWJsZSh0LmxhYmxlcyRGcmVxKQpnZ3Bsb3QodC5sYWJsZXMsIGFlcyh5ID0gRnJlcSwgeCA9IFZhcjEsIGZpbGwgPSBWYXIyKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJzdGFjayIsIHN0YXQ9ICJpZGVudGl0eSIpCgojIHNlZSBwcmVkaWN0aW9ucyBieSBjbHVzdGVyIGluIGEgdGFibGUKdG9wLnByZWQgPC0gYXMuZGF0YS5mcmFtZSh0LmxhYmxlcyAgJT4lIGdyb3VwX2J5KFZhcjEpICAlPiUgdG9wX24oMiwgRnJlcSkpICU+JSBhcnJhbmdlKFZhcjEsIGRlc2MoRnJlcSkpCnRvcC5wcmVkCgoKCmBgYAoKCgoKc2NDbGFzc2lmeSBSIHdlaWdodGVkIGtOTiBodHRwczovL2RvaS5vcmcvMTAuMTUyNTIvbXNiLjIwMTk5Mzg5Cmh0dHBzOi8vc3lkbmV5YmlveC5naXRodWIuaW8vc2NDbGFzc2lmeS9hcnRpY2xlcy9zY0NsYXNzaWZ5Lmh0bWwKCldlIG5lZWQgdG8gbWFrZSB0aGUgcmVmZXJlbmNlIGFuZCBxdWVyeSBvYmplY3RzIGludG8gYSAiZGdDTWF0cml4IiBvYmplY3QKCmBgYHtyfQoKcmVmIDwtIGRldmZvcmVicmFpbgoKcmVmJExldmVsMSA8LSBOVUxMCgpjb2xuYW1lcyhyZWZAbWV0YS5kYXRhKQoKCiMgbWFrZSBhIGRmQ01hdHJpeCBmcm9tIFNldXJhdCBvYmplY3QgdG8gdXNlIGluIHNjQ2xhc3NpZnkKSWRlbnRzKHJlZikgPC0gIkNlbGx0eXBlcyIKCmRnQ01hdF9yZWYgPC0gR2V0QXNzYXlEYXRhKHJlZikKIyBnZXQgdGhlIGNlbGwgdHlwZSBkYXRhCklkZW50cyhyZWYpIDwtICJDZWxsdHlwZXMiCnJlZl9jZWxsdHlwZXMgPC0gSWRlbnRzKHJlZikKdW5pcXVlKHJlZl9jZWxsdHlwZXMpCgoKIyBjb252ZXJ0IHRoZSBpbnRlZ3JhdGVkIGNsdXN0ZXJlZCBvYmplY3QgaW50byBkZ0NNYXRyaXgKRGVmYXVsdEFzc2F5KGludGVncmF0ZWRfc2V1cmF0KSA8LSAiUk5BIgpkZ0NNYXRfcXVlcnkgPC0gR2V0QXNzYXlEYXRhKGludGVncmF0ZWRfc2V1cmF0KQoKIyBnZXQgdGhlIG1ldGEgZGF0YSB0byBncm91cCBwcmVkaWN0aW9ucyBieQojIHdlIHdpbGwgdXNlIHRoZSBjbHVzdGVycyBpZHMgCiMgd2UgY291bGQgdXNlIHRoZSBjZWxsIHR5cGUgYW5ub3RhdGlvbnMgd2UgbWFkZSBhYm92ZQoKSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KSA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiCnF1ZXJ5X2NsdXN0ZXJzIDwtIElkZW50cyhpbnRlZ3JhdGVkX3NldXJhdCkKCklkZW50cyhpbnRlZ3JhdGVkX3NldXJhdCkgPC0gIkNlbGxUeXBlcyIgIApxdWVyeV9jZWxsdHlwZXMgPC0gSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KQoKbGVuZ3RoKHF1ZXJ5X2NsdXN0ZXJzKQojIGNoZWNrIHRoZSBvYmplY3RzCmRpbShkZ0NNYXRfcmVmKQpkaW0oZGdDTWF0X3F1ZXJ5KQoKY2xhc3MoZGdDTWF0X3JlZikKY2xhc3MoZGdDTWF0X3F1ZXJ5KQoKYGBgCgpTZWUgdGhlIG9yaWdpbmFsIGNlbGwgdHlwZSBhbm5vdGF0aW9ucwpgYGB7cn0KdGFibGUocmVmX2NlbGx0eXBlcykKdGFibGUocXVlcnlfY2x1c3RlcnMpCgpsZW5ndGgocmVmX2NlbGx0eXBlcykKbGVuZ3RoKHF1ZXJ5X2NlbGx0eXBlcykKCnF1ZXJ5X2NlbGx0eXBlc1sxOjEwXQoKCmBgYAoKUnVuIHNjQ2xhc3NpZnkKYGBge3J9CgpzY0NsYXNzaWZ5X3JlcyA8LSBzY0NsYXNzaWZ5KGV4cHJzTWF0X3RyYWluID0gZGdDTWF0X3JlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsVHlwZXNfdHJhaW4gPSByZWZfY2VsbHR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJzTWF0X3Rlc3QgPSBkZ0NNYXRfcXVlcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFR5cGVzX3Rlc3QgPSBxdWVyeV9jZWxsdHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSA9ICJIT1BBQ0giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSA9ICJXS05OIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RGZWF0dXJlcyA9IGMoImxpbW1hIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltaWxhcml0eSA9IGMoInBlYXJzb24iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5MaXN0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFKQoKCgpgYGAKCmBgYHtyfQoKCnBsb3RDZWxsVHlwZVRyZWUoY2VsbFR5cGVUcmVlKHNjQ2xhc3NpZnlfcmVzJHRyYWluUmVzKSkKCgpgYGAKCgoKU2VlIHRoZSBjZWxsIHR5cGUgcHJlZGljdGlvbnMgYnkgY2x1c3RlcgoKYGBge3J9Cgp0YWJsZShzY0NsYXNzaWZ5X3JlcyR0ZXN0UmVzJHRlc3QkcGVhcnNvbl9XS05OX2xpbW1hJHByZWRSZXMscXVlcnlfY2x1c3RlcnMpCnRhYmxlKHNjQ2xhc3NpZnlfcmVzJHRlc3RSZXMkdGVzdCRwZWFyc29uX1dLTk5fbGltbWEkcHJlZFJlcyxxdWVyeV9jZWxsdHlwZXMpCgpgYGAKCgpDaGVjayBhbm90aGVyIHJlZmVyZW5jZSBzZXQKCmBgYHtyfQojIHJlZnJlbmNlIGRhdGEKIyB3ZSBoYXZlIHRoZSBkYXRhIHByZXBhcmVkIGFzIGEgU2V1cmF0IG9iamVjdAoKcmVmMiA8LSBtaWRicmFpbgpyZWYyCgojY2hlY2sgdGhlIG1ldGEgZGF0YQpjb2xuYW1lcyhyZWYyQG1ldGEuZGF0YSkKCiNtYWtlIHRoZSByZWZlcmVuY2UgbWF0cml4IGFuZCByZWZlcmVuY2UgY2VsbCB0eXBlcyAKCgpkZ0NNYXRfcmVmMiA8LSBHZXRBc3NheURhdGEocmVmMikKIyBnZXQgdGhlIGNlbGwgdHlwZSBkYXRhCklkZW50cyhyZWYyKSA8LSAiQ2VsbF9UeXBlIiAKcmVmX2NlbGx0eXBlczIgPC0gSWRlbnRzKHJlZjIpCnVuaXF1ZShyZWZfY2VsbHR5cGVzMikKCiMgY2hlY2sgdGhlIG9iamVjdApkaW0oZGdDTWF0X3JlZjIpCgoKY2xhc3MoZGdDTWF0X3JlZjIpCgoKCmBgYAoKYGBge3J9CiMgcHJlZGljdCB0aGUgY2x1c3RlciBjZWxsIHR5cGVzIGZyb20gdGhlIHNlY29uZCByZWZlcmVuY2UKc2NDbGFzc2lmeV9yZXMgPC0gc2NDbGFzc2lmeShleHByc01hdF90cmFpbiA9IGRnQ01hdF9yZWYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxUeXBlc190cmFpbiA9IHJlZl9jZWxsdHlwZXMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJzTWF0X3Rlc3QgPSBkZ0NNYXRfcXVlcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFR5cGVzX3Rlc3QgPSBxdWVyeV9jbHVzdGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlID0gIkhPUEFDSCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtID0gIldLTk4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEZlYXR1cmVzID0gYygibGltbWEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1pbGFyaXR5ID0gYygicGVhcnNvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkxpc3QgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UpClN5cy50aW1lKCkKCmBgYAoKYGBge3J9CgpwbG90Q2VsbFR5cGVUcmVlKGNlbGxUeXBlVHJlZShzY0NsYXNzaWZ5X3JlcyR0cmFpblJlcykpCgpgYGAKClNlZSB0aGUgcHJlZGljdGlvbnMgYnkgY2x1c3RlcgoKYGBge3J9CnRhYmxlKHNjQ2xhc3NpZnlfcmVzJHRlc3RSZXMkdGVzdCRwZWFyc29uX1dLTk5fbGltbWEkcHJlZFJlcyxxdWVyeV9jbHVzdGVycykKCgoKYGBgCgpgYGB7cn0KIyByZWZvcm1hdCB0byBzZWUgdGhlIHRvcCBwcmVkaWN0aW9ucyBmb3IgZWFjaCBjbHVzdGVyCgpwcmVkX2NvdW50cyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHF1ZXJ5X2NsdXN0ZXJzLHNjQ2xhc3NpZnlfcmVzJHRlc3RSZXMkdGVzdCRwZWFyc29uX1dLTk5fbGltbWEkcHJlZFJlcykpCgpwcmVkX2NvdW50cyRGcmVxIDwtIGFzLmRvdWJsZShwcmVkX2NvdW50cyRGcmVxKQoKaGVhZChwcmVkX2NvdW50cykKIyBzZWUgcHJlZGljdGlvbnMgYnkgY2x1c3RlciBpbiBhIHRhYmxlCnRvcC5wcmVkIDwtIGFzLmRhdGEuZnJhbWUocHJlZF9jb3VudHMgICU+JSBncm91cF9ieShxdWVyeV9jbHVzdGVycykgICU+JSB0b3BfbigyLCBGcmVxKSkgJT4lIGFycmFuZ2UocXVlcnlfY2x1c3RlcnMsIGRlc2MoRnJlcSkpCnRvcC5wcmVkCgoKYGBgCgoKQWRkIHByZWRpY3Rpb24gYW5ub3RhdGlvbnMKCgpgYGB7cn0KCgpgYGAKCkFkanVzdCBhbm5vdGF0aW9ucyAtIG1lcmdlIGNsdXN0ZXJzIG9yIG5vdAoKYGBge3J9CgoKYGBgCgoKCgo=